Directorio de artículos
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.
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:nano
microsegundos
autoCreateTime:milli
milisegundos
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:nano
microsegundos
autoCreateTime:milli
milisegundos
-
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)