Gorm: conexión de configuración, modelo de Gorm y descripción de la etiqueta

Introducir dependencias

go get -u github.com/spf13/viper
go get -u gorm.io/gorm 
go get -u gorm.io/driver/mysql

leer el archivo de configuración

La estructura del archivo de configuración es la siguiente:
se establecen las tres configuraciones de información de conexión de base de datos, número máximo de conexiones y número máximo de inactividad.
inserte la descripción de la imagen aquí

package config

import (
	"github.com/spf13/viper"
)

var AppConfig *Config

type Config struct {
    
    
	Mysql MysqlConfig `json:"mysql"`
}
/*
* Mysql 相关配置
 */
type MysqlConfig struct {
    
    
	Dsn          string `json:"Dsn"`
	MaxIdleConns *int   `json:"MaxIdleConns,omitempty"`
	MaxOpenConns *int   `json:"MaxOpenConns,omitempty"`
}
func LoadConfig() error {
    
    
	viper.SetConfigName("config")
	viper.SetConfigType("yaml")
	viper.AddConfigPath("./config")

	//读取配置文件
	if err := viper.ReadInConfig(); err != nil {
    
    
		return err
	}
	//将配置文件中的信息读取到结构体中
	if err := viper.Unmarshal(&AppConfig); err != nil {
    
    
		return err
	}
	return nil
}

func GetAppConfig() Config {
    
    
	return *AppConfig
}

Configurar el grupo de conexiones de la base de datos

  • Use un grupo de conexiones para evitar la creación frecuente de conexiones de base de datos
  • Controla el número máximo de conexiones y el número máximo de inactividad
  • Gorm usa la forma plural del nombre de la tabla de forma predeterminada, es decir, si se usa la estructura de usuario , el nombre de la tabla correspondiente es usuarios de forma predeterminada , y el nombre de la tabla debe configurarse para que no use la forma plural.
package cus_orm

import (
	"mingvvv/config"

	"gorm.io/driver/mysql"
	"gorm.io/gorm/schema"

	"gorm.io/gorm"
)

var db *gorm.DB

func MysqlConnection() *gorm.DB {
    
    
	if db == nil {
    
    

		config := config.GetAppConfig()

		dsn := &config.Mysql.Dsn
		maxIdleConns := config.Mysql.MaxIdleConns
		maxOpenConns := config.Mysql.MaxOpenConns

		if dsn == nil {
    
    
			panic("non mysql dsn")
		}

		dbcreater, err := gorm.Open(mysql.Open(*dsn), &gorm.Config{
    
    
			NamingStrategy: schema.NamingStrategy{
    
    
				SingularTable: true, //表名不使用复数形式
			},
		})
		db = dbcreater
		if err != nil {
    
    
			panic("failed to connect database")
		}

		sqlDb, _ := db.DB()

		if maxIdleConns != nil {
    
    
			sqlDb.SetMaxIdleConns(*maxIdleConns) // 设置最大空闲数
		}
		if maxOpenConns != nil {
    
    
			sqlDb.SetMaxOpenConns(*maxOpenConns) // 设置最大连接数
		}
	}

	return db
}

definir modelo

Información de la tabla de la base de datos

CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '姓名',
  `infant_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '小名',
  `age` int DEFAULT NULL COMMENT '年龄',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '修改时间',
  `user_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '描述',
  `json_field` json DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=534 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `user_role` (
  `id` int NOT NULL AUTO_INCREMENT,
  `user_id` int DEFAULT NULL COMMENT '用户ID',
  `role_id` int DEFAULT NULL COMMENT '角色ID\r\n',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=531 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

Crear la estructura correspondiente

type User struct {
    
    
	Id         uint   `json:"id" gorm:"primary_key;AUTO_INCREMENT"`
	Name       string `gorm:"column:name"`
	InfantName string
	Age        int `gorm:"default:18"`
	UserDesc   string
	JsonField  map[string]string `gorm:"serializer:json"`
	CreateTime time.Time
	UpdateTime time.Time
	UserRole   UserRole   `gorm:"foreignKey:UserId;references:Id"` //指定外键
}

type UserRole struct {
    
    
	Id     uint `json:"id" gorm:"primary_key;AUTO_INCREMENT"`
	UserId uint
	RoleId uint
}

Propiedad de etiqueta para campos en el modelo de datos

Como antes, cuando creamos un modelo de datos, agregamos una serie de etiquetas gorm después del campo, y estas etiquetas afectarán el rendimiento funcional del campo al leer y escribir.
Los siguientes son varios atributos de etiquetas de uso común, y el resto puede hacer referencia al enlace del sitio web oficial
https://gorm.io/docs/models.html#embedded_struct

columna

Se utiliza para especificar qué campo de la base de datos corresponde al campo de la estructura Por ejemplo, el Nombre especificado en
la estructura Usuario corresponde al campo de nombre en la tabla de la base de datos.

serializador

Especifica cómo se serializa el campo.

Por ejemplo, existe una línea de este tipo en la estructura Usuario

JsonField  map[string]string `gorm:"serializer:json"`

Indica la conversión de serialización entre el diccionario en la estructura y el tipo json en la base de datos.
Si no hacemos la serialización, lanzaremos una excepción cuando agreguemos o leamos datos:

//新增时
[error] unsupported data type: &map[]

Clave primaria

Especificar el campo como la clave principal

por defecto

Especifica el valor predeterminado para el campo.

autoIncremento / AUTO_INCREMENTO

Especifique el campo como de incremento automático.
Tenga en cuenta que si el campo se establece con una etiqueta de tipo, la etiqueta de incremento automático debe establecerse inmediatamente después de la etiqueta de tipo, de lo contrario, es posible que no surta efecto. Por
ejemplogorm:"type:bigint autoIncrement"

incrustado / incrustadoPrefijo

incrustado Incruste los campos en la estructura en la estructura actual, incrustadoPrefijo agrega un prefijo antes de la propiedad

type Desc struct {
    
    
	Desc1 string
	Desc2 string
}
type User struct {
    
    
	Id         uint   `json:"id" gorm:"primary_key;AUTO_INCREMENT"`
	Name       string `gorm:"column:name"`
	InfantName string
	Age        int               `gorm:"default:18"`
	Desc       Desc              `gorm:"embedded;embeddedPrefix:user_"`
}

La estructura Usuario es equivalente a la siguiente estructura

type User struct {
    
    
	Id         uint   `json:"id" gorm:"primary_key;AUTO_INCREMENT"`
	Name       string `gorm:"column:name"`
	InfantName string
	Age        int     `gorm:"default:18"`
	Desc1      string  `gorm:"column:user_desc1"`
	Desc2      string  `gorm:"column:user_desc2"`
}

tiempo de creación automática

Rellene automáticamente la hora actual cuando se crea. Cuando el atributo de campo es de tipo int, obtendrá la marca de tiempo de Unix de la hora actual
autoCreateTime:nanomicrosegundos
autoCreateTime:millimilisegundos

tiempo de actualización automática

Rellene automáticamente la hora actual al crear o modificar. Cuando el atributo de campo es de tipo int, obtendrá la marca de tiempo de Unix de la hora actual en
autoCreateTime:nanomicrosegundos
autoCreateTime:millimilisegundos

-

ignorar el campo actual

clave extranjera / referencias

Configurar asociaciones de claves foráneas

Esta línea en la estructura Usuario

UserRole   UserRole   `gorm:"foreignKey:UserId;references:Id"`

Significa: La clave externa de
user_role es user_id , que corresponde al campo id de la tabla de usuarios . Desde la perspectiva de la relación de la estructura, la estructura UserRole está asociada con el UserId y el Id de la estructura User .

Esta relación desencadenará una operación de inserción asociada cuando se agreguen nuevos datos,
es decir, si se inserta una parte de los datos del usuario y el UserRole en la estructura no es cero, también insertará una parte de los datos en la tabla user_role al mismo tiempo y automáticamente completará el valor de la clave externa (Id de la tabla del usuario)

Supongo que te gusta

Origin blog.csdn.net/qq_40096897/article/details/129026914
Recomendado
Clasificación