gorm opera mysql

contenido

1. Introducción a gorm

Segundo, instalación de gorm

Tres, definición del modelo gorm

1. Introducción al ORM

2, definición del modelo gorm

3. etiqueta del modelo gorm

4. Defina el nombre de la tabla

5、gorm.Modelo

6. Tiempo de actualización automática

Cuatro, base de datos de conexión gorm

1. Configurar DSN (Nombre de fuente de datos)

2. Use gorm.Open para conectarse a la base de datos

3. modo de depuración gorm

4. grupo de conexiones gorm


1. Introducción a gorm

GORM es la biblioteca de operación de base de datos ORM más popular en Golang en la actualidad. También es amigable para los desarrolladores. Es muy conveniente y fácil de usar. Se usa principalmente para mapear tipos de estructuras y registros de tablas de bases de datos. Al operar la base de datos, hay no es necesario escribir el código Sql directamente Aquí se presenta principalmente la base de datos MySQL.

Dirección de github de la biblioteca GORM: https://github.com/go-gorm/gorm

Segundo, instalación de gorm

Operar MySQL requiere la instalación de dos paquetes:

  • Paquete de controladores MySQL
  • Los paquetes GORM usan el comando go get para instalar dependencias

//安装MySQL驱动
go get -u gorm.io/driver/mysql
//安装gorm包
go get -u gorm.io/gorm

paquete de importación

import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

Tres, definición del modelo gorm

1. Introducción al ORM

El marco ORM requiere un modelo predefinido para operar la base de datos.El modelo puede entenderse como un modelo de datos como un medio para operar la base de datos.

Entre.

P.ej:

  • Los datos leídos de la base de datos se guardarán primero en el objeto modelo predefinido y luego podremos obtener los datos que queremos del objeto modelo.
  • Insertar datos en la base de datos también es crear un nuevo objeto modelo primero, luego guardar los datos que desea guardar en el objeto modelo y luego guardar el objeto modelo en la base de datos.

En golang, la definición del modelo gorm se implementa a través de struct, de modo que podemos implementar el mapeo entre el tipo de estructura y los datos de la tabla mysql a través de la biblioteca gorm.

Sugerencia: gorm es responsable de traducir las operaciones de lectura y escritura del modelo en declaraciones SQL, y luego gorm convierte los resultados devueltos por la base de datos después de ejecutar las declaraciones SQL en los objetos del modelo que definimos.

2, definición del modelo gorm

La definición del modelo gorm es principalmente para agregar etiquetas de campo a la definición del tipo de estructura para describir la implementación.Veamos un ejemplo completo a continuación. Si hay una tabla de productos básicos, la estructura de la tabla es la siguiente

CREATE TABLE `food` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID,商品Id',
  `name` varchar(30) NOT NULL COMMENT '商品名',
  `price` decimal(10,2) unsigned  NOT NULL COMMENT '商品价格',
  `type_id` int(10) unsigned NOT NULL COMMENT '商品类型Id',
  `createtime` int(10) NOT NULL DEFAULT 0 COMMENT '创建时间',
   PRIMARY KEY (`id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8

El modelo se define de la siguiente manera

//字段注释说明了gorm库把struct字段转换为表字段名长什么样子。
type Food struct {
	Id         int  //表字段名为:id
	Name       string //表字段名为:name
	Price      float64 //表字段名为:price
	TypeId     int  //表字段名为:type_id
	
 //字段定义后面使用两个反引号``包裹起来的字符串部分叫做标签定义,这个是golang的基础语法,不同的库会定义不同的标签,有不同的含义
	CreateTime int64 `gorm:"column:createtime"`  //表字段名为:createtime
}

Por defecto, gorm usa el estilo de nomenclatura Snake Case para los nombres de campo de estructura para convertirlos a nombres de campo de tabla mysql (debe convertirse a letras minúsculas).

De acuerdo con la convención predeterminada de gorm, el ejemplo anterior solo necesita usar la etiqueta gorm:"column:createtime" para definir el nombre del campo de la tabla para el campo CreateTime y usar el valor predeterminado para los demás.

Sugerencia: El estilo de nomenclatura de Snake Case consiste en separar cada palabra con un guión bajo (_), por ejemplo: el estilo de Snake Case de CreateTime se llama create_time

3. etiqueta del modelo gorm

A través del ejemplo anterior, puede ver que puede definir el nombre de la columna (nombre del campo de la tabla) del campo de estructura a través de una sintaxis de definición de etiquetas como gorm:"column:createtime".

gorm标签语法:gorm:"标签定义"

En la sección de definición de etiquetas, varias definiciones de etiquetas se pueden separar con un punto y coma (;), por ejemplo, para definir nombres de columnas:

gorm:"column:列名"

Las etiquetas de gorm comúnmente utilizadas son las siguientes:

Etiqueta

ilustrar

ejemplo

columna

Especificar nombres de columna

gorm:"columna:createtime"

Clave primaria

Especificar la clave principal

gorm:"columna:id; PRIMARY_KEY"

-

ignorar campos

gorm:"-" puede ignorar el campo de estructura, y los campos ignorados no participan en las operaciones de lectura y escritura de gorm

4. Defina el nombre de la tabla

Puede definir el nombre de la tabla del modelo definiendo la función TableName del tipo de estructura

Tome el ejemplo anterior:

//设置表名,可以通过给Food struct类型定义 TableName函数,返回一个字符串作为表名
func (v Food) TableName() string {
	return "food"
}

        Sugerencia: De forma predeterminada, el nombre de la tabla se define para el modelo. A veces, el modelo de definición solo se usa para recibir los resultados de la consulta sql escrita a mano. En este caso, no es necesario definir el nombre de la tabla; especifique manualmente el nombre de la tabla a través de la función gorm Table(), y tampoco la función TableName necesita ser definida para el modelo.

5、gorm.Modelo

GORM define una estructura gorm.Model que incluye los campos ID, CreatedAt, UpdatedAt, DeletedAt.

// gorm.Model 的定义
type Model struct {
  ID        uint           `gorm:"primaryKey"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt gorm.DeletedAt `gorm:"index"`
}

Para incrustarlo en nuestra estructura, podemos incluir estos campos, similar al efecto de la herencia.

type User struct {
  gorm.Model // 嵌入gorm.Model的字段
  Name string
}

6. Tiempo de actualización automática

La convención GORM usa CreatedAt, UpdatedAt para rastrear el tiempo de creación/actualización. Si se define dicho campo, GORM completará automáticamente la hora actual cuando se cree o actualice.

Para usar campos con diferentes nombres, puede configurar las etiquetas autoCreateTime, autoUpdateTime

Si desea almacenar marcas de tiempo de segundos UNIX (mili/nano) en lugar de tiempo, simplemente cambie time.Time a int.

ejemplo:

type User struct {
  CreatedAt time.Time // 默认创建时间字段, 在创建时,如果该字段值为零值,则使用当前时间填充
  UpdatedAt int       // 默认更新时间字段, 在创建时该字段值为零值或者在更新时,使用当前时间戳秒数填充
  Updated   int64 `gorm:"autoUpdateTime:nano"` // 自定义字段, 使用时间戳填纳秒数充更新时间
  Updated   int64 `gorm:"autoUpdateTime:milli"` //自定义字段, 使用时间戳毫秒数填充更新时间
  Created   int64 `gorm:"autoCreateTime"`      //自定义字段, 使用时间戳秒数填充创建时间
}

Cuatro, base de datos de conexión gorm

gorm admite una variedad de bases de datos, aquí se presenta principalmente mysql, hay dos pasos principales para conectar mysql:

1) Configurar DSN (Nombre de fuente de datos)

2) Use gorm.Open para conectarse a la base de datos

1. Configurar DSN (Nombre de fuente de datos)

La biblioteca gorm usa dsn como parámetro para conectarse a la base de datos. El dsn se llama el nombre de la fuente de datos cuando se traduce y se usa para describir la información de conexión de la base de datos. Generalmente, contiene la dirección de conexión de la base de datos, el número de cuenta, la contraseña y otra información.

Formato DSN:

[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN]

mysql conexión dsn ejemplo:

//mysql dsn格式
//涉及参数:
//username   数据库账号
//password   数据库密码
//host       数据库连接地址,可以是Ip或者域名
//port       数据库端口
//Dbname     数据库名
username:password@tcp(host:port)/Dbname?charset=utf8&parseTime=True&loc=Local

//填上参数后的例子
//username = root
//password = 123456
//host     = localhost
//port     = 3306
//Dbname   = tizi365
//后面K/V键值对参数含义为:
//  charset=utf8 客户端字符集为utf8
//  parseTime=true 支持把数据库datetime和date类型转换为golang的time.Time类型
//  loc=Local 使用系统本地时区
root:123456@tcp(localhost:3306)/tizi365?charset=utf8&parseTime=True&loc=Local

//gorm 设置mysql连接超时参数
//开发的时候经常需要设置数据库连接超时参数,gorm是通过dsn的timeout参数配置
//例如,设置10秒后连接超时,timeout=10s
//下面是完成的例子
root:123456@tcp(localhost:3306)/tizi365?charset=utf8&parseTime=True&loc=Local&timeout=10s

//设置读写超时时间
// readTimeout - 读超时时间,0代表不限制
// writeTimeout - 写超时时间,0代表不限制
root:123456@tcp(localhost:3306)/tizi365?charset=utf8&parseTime=True&loc=Local&timeout=10s&readTimeout=30s&writeTimeout=60s

2. Use gorm.Open para conectarse a la base de datos

Con los parámetros dsn configurados anteriormente, puede usar gorm para conectarse a la base de datos. El siguiente es un ejemplo de conexión a la base de datos.

package main

import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

func main()  {
    //配置MySQL连接参数
	username := "root"  //账号
	password := "123456" //密码
	host := "127.0.0.1" //数据库地址,可以是Ip或者域名
	port := 3306 //数据库端口
	Dbname := "tizi365" //数据库名
	timeout := "10s" //连接超时,10秒
	
	//拼接下dsn参数, dsn格式可以参考上面的语法,这里使用Sprintf动态拼接dsn参数,因为一般数据库连接参数,我们都是保存在配置文件里面,需要从配置文件加载参数,然后拼接dsn。
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)
	//连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("连接数据库失败, error=" + err.Error())
	}
	//延时关闭数据库连接
	defer db.Close()
}

3. modo de depuración gorm

Para facilitar la depuración y comprender qué tipo de instrucción SQL ejecuta la operación gorm, debe abrir el registro de depuración durante el desarrollo, para que gorm imprima cada instrucción SQL ejecutada.

Utilice la función de depuración para ejecutar la consulta

result := db.Debug().Where("username = ?", "tizi365").First(&u)

4. grupo de conexiones gorm

En la práctica de alta concurrencia, para mejorar la tasa de utilización de las conexiones de bases de datos y evitar el consumo de rendimiento causado por el establecimiento repetido de conexiones de bases de datos, la tecnología de agrupación de conexiones de bases de datos se usa a menudo para mantener las conexiones de bases de datos.

gorm viene con un grupo de conexión de base de datos, que es muy simple de usar, solo configure los parámetros del grupo de conexión de base de datos.

Ejemplo de uso del grupo de conexiones de base de datos:

Defina el paquete de herramientas para que sea responsable de la inicialización de la base de datos (Nota: con la ayuda de la descripción del grupo de conexiones, generalmente cuando se opera la base de datos, la conexión de la base de datos se puede encapsular en un paquete por separado)

//定义一个工具包,用来管理gorm数据库连接池的初始化工作。
package tools

//定义全局的db对象,我们执行数据库操作主要通过他实现。
var _db *gorm.DB

//包初始化函数,golang特性,每个包初始化的时候会自动执行init函数,这里用来初始化gorm。
func init() {
    ...忽略dsn配置,请参考上面例子...
    
    // 声明err变量,下面不能使用:=赋值运算符,否则_db变量会当成局部变量,导致外部无法访问_db变量
    var err error
    //连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
    _db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
		panic("连接数据库失败, error=" + err.Error())
	}
     
    sqlDB, _ := db.DB()

    //设置数据库连接池参数
    sqlDB.SetMaxOpenConns(100)   //设置数据库连接池最大连接数
    sqlDB.SetMaxIdleConns(20)   //连接池最大允许的空闲连接数,如果没有sql任务需要执行的连接数大于20,超过的连接会被连接池关闭。
}

//获取gorm db对象,其他包需要执行数据库查询的时候,只要通过tools.getDB()获取db对象即可。
//不用担心协程并发使用同样的db对象会共用同一个连接,db对象在调用他的方法的时候会从数据库连接池中获取新的连接
func GetDB() *gorm.DB {
	return _db
}

Ejemplo de uso:

package main
//导入tools包
import tools

func main() {
    //获取DB
    db := tools.GetDB()
    
    //执行数据库查询操作
    u := User{}
	//自动生成sql: SELECT * FROM `users`  WHERE (username = 'tizi365') LIMIT 1
	db.Where("username = ?", "tizi365").First(&u)
}

Nota: Después de usar la tecnología del grupo de conexiones, no llame a db.Close para cerrar la conexión de la base de datos después de usar el db, lo que hará que se cierre todo el grupo de conexiones de la base de datos, lo que dará como resultado que no haya conexiones disponibles en el grupo de conexiones.

Supongo que te gusta

Origin blog.csdn.net/demored/article/details/124325939
Recomendado
Clasificación