Golangを使用してAPIフレームワークデータベースオペレーションをカプセル化する(gormで導入)

序文:

フレームワークにデータベースがないと操作できません。このフレームワークは一時的にgormsを導入します。gormsが正常に使用されない場合は、Golangデータベースドライバーに基づくホイールの作成を検討する必要があります

  1. gormの紹介

    // 在 go.mod 中加入
    require github.com/jinzhu/gorm v1.9.12
    

    gormを導入すると、暗号リソースが壁にブロックされてプルできない場合がありますが、現時点ではgormインストールを手動でダウンロードする必要があります。

    cd $PATH/pkg/mod/cache/download/golang.org/x/
    git clone  https://github.com/golang/crypto.git
    go mod download				// 重新安装
    
  2. MySQL構成を取得する

    MySQLの構成については、構成ファイルがconfディレクトリに定義されています:mysql.go

    package conf
    
    var mysqlConf = map[string]map[string]string{
    	"default": {
    		"host":     "",
    		"password": "",
    		"port":     "",
    		"user":     "",
    		"dbname":   "",
    	},
    }
    
    func GetAllMysqlConf() map[string]map[string]string {
    	return mysqlConf
    }
    
    func GetMysqlConf(key string) map[string]string {
    	if key == "" {
    		key = "default"
    	}
    	return mysqlConf[key]
    }
    

    このファイルには、データベースの関連する構成を格納する変数が定義されており、すべてのデータベース構成と単一の構成を取得するための次の方法

  3. モデルを定義

    1. BaseModelオブジェクトはモデル/ baseModelで定義され、データベース接続を取得およびデータベース接続を解放するためのメソッドがこのオブジェクトで定義されています

      type BaseModel struct {
      	dbConnect *gorm.DB
      }
      
      func (baseModel BaseModel) getDbConnect() *gorm.DB {
      	var err error
      	mysqlConfig := conf.GetMysqlConf("default")
      
      	fmt.Println(mysqlConfig["user"] + ":" + mysqlConfig["password"] + "@(" + mysqlConfig["host"] + ":" + mysqlConfig["port"] + ")/" + mysqlConfig["dbname"] + "?charset=utf8&parseTime=True&loc=Local")
      
      	baseModel.dbConnect, err = gorm.Open("mysql", mysqlConfig["user"]+":"+mysqlConfig["password"]+"@("+mysqlConfig["host"]+":"+mysqlConfig["port"]+")/"+mysqlConfig["dbname"]+"?charset=utf8&parseTime=True&loc=Local")
      	//defer baseModel.dbConnect.Close()
      	if err != nil {
      		// 打日志
      		log.Println("数据库连接错误----", err)
      		return nil
      	}
      	return baseModel.dbConnect
      }
      
      func (baseModel BaseModel) close() {
      	if baseModel.dbConnect != nil {
      		baseModel.dbConnect.Close()
      	}
      }
      

      データベース接続を取得する方法で、データベース接続を解放する操作を書き込むのに遅延を使用しない理由は、遅延操作の実行時間が、関数が終了してから終了するまでの時間であるためです。データベース接続を解放する操作がデータベース接続を取得するメソッドに記述されている場合、この接続は役に立たなくなる前に解放されます。

    2. models / testModel.goでテストモデルを定義し、以下の4のテストコントローラーで使用します

      type TestModel struct {
      	BaseModel
      }
      
      func (test TestModel) Test() {
      	db := test.getDbConnect()									// 获取连接
      	if db == nil {
      		fmt.Println("db 连接失败")
      	}
      	
        // 查询语句
      	rows, err := db.Raw("sql", ...args).Rows() 
      
      	if err != nil {
      		fmt.Println(err)
      		return
      	}
      	// 这个变量对应数据库中表的字段
      	var a, b, c, d, e, f string							
      	for rows.Next() {
      		rows.Scan(&a, &b, &c, &d, &e, &f)
      		fmt.Println(a, b, c, d, e, f)
      	}
        defer rows.Close()
        
        // 更新语句
        db.Exec("sql", ...args)
      	// 根据 db.Error 和 db.RowsAffected 来判断 释放执行成功
      
      	defer test.close()
      }
      
  4. コントローラーで使用

    コントローラ/ testController.goで直接呼び出すだけです

    type TestController struct {
    }
    
    func (t *TestController) Test(w http.ResponseWriter, r *http.Request) {
    
       testModel := models.TestModel{}
       testModel.Test()
    
       fmt.Fprint(w, "this is test.test")
    
    }
    

注:
1.テスト中にテストコントローラーのルーティングを登録する必要があり、データベースのリンク構成が正確である必要があります
2.このブログのサンプルコードアドレス:https : //github.com/zhuchenglin/goweb
3.作成は簡単ではありません、転載する必要がある場合は、出典を明記してください。https//www.cnblogs.com/zhuchenglin/p/12731078.html

おすすめ

転載: www.cnblogs.com/zhuchenglin/p/12731078.html