Use Golang para encapsular una operación de base de datos Api framework (introducida por gorm)

Prólogo

Es imposible operar sin una base de datos en un marco. Este marco introduce temporalmente gorms. Si los gorms no se usan sin problemas, debe considerar conducir sus propias ruedas según la base de datos Golang.

  1. Introduciendo Gorm

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

    Al presentar el gorm, puede encontrar que el recurso de cifrado está bloqueado por el muro y no se puede extraer. En este momento, debe descargar manualmente la instalación del gorm.

    cd $PATH/pkg/mod/cache/download/golang.org/x/
    git clone  https://github.com/golang/crypto.git
    go mod download				// 重新安装
    
  2. Obtener la configuración de MySQL

    Acerca de la configuración de MySQL, se define un archivo de configuración en el directorio 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]
    }
    

    En este archivo se define una variable que almacena la configuración relevante de la base de datos y el siguiente método para obtener todas las configuraciones de la base de datos y una sola configuración

  3. Definir modelo

    1. Un objeto BaseModel se define en models / baseModel, y los métodos para obtener la conexión de la base de datos y liberar la conexión de la base de datos se definen en este objeto

      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()
      	}
      }
      

      La razón por la que no se usa el aplazamiento para escribir la operación de liberación de la conexión de la base de datos en el método de obtención de la conexión de la base de datos es que el tiempo de ejecución de la operación de aplazamiento es posterior al retorno y antes de que la función finalice. Si la operación de liberar la conexión de la base de datos se escribe en el método para obtener la conexión de la base de datos, esta conexión se liberará antes de que sea inútil .

    2. Defina el modelo de prueba en models / testModel.go y utilícelo en el controlador de prueba en 4 a continuación

      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. Utilizado en el controlador

    Simplemente llámelo directamente en controller / 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")
    
    }
    

Nota:
1. Es necesario registrar el enrutamiento del controlador de prueba durante la prueba, y la configuración del enlace de la base de datos debe ser precisa
2. La dirección del código de muestra de este blog: https://github.com/zhuchenglin/goweb
3. La creación no es fácil , Si necesita volver a imprimir, indique la fuente: https://www.cnblogs.com/zhuchenglin/p/12731078.html

Supongo que te gusta

Origin www.cnblogs.com/zhuchenglin/p/12731078.html
Recomendado
Clasificación