golang gorm使用记录

用于Golang的出色的ORM库旨在对开发人员友好。
GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server

安装

1
go get -u gorm.io/gorm

字段级权限控制

1
2
3
4
5
6
7
8
9
10
type User struct {
Name string `gorm:"<-:create"` // allow read and create
Name string `gorm:"<-:update"` // allow read and update
Name string `gorm:"<-"` // allow read and write (create and update)
Name string `gorm:"<-:false"` // allow read, disable write permission
Name string `gorm:"->"` // readonly (disable write permission unless it configured )
Name string `gorm:"->;<-:create"` // allow read and create
Name string `gorm:"->:false;<-:create"` // createonly (disabled read from db)
Name string `gorm:"-"` // ignore this field when write and read with struct
}

字段标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
column                  指定 db 列名
type 列数据类型
size 指定列大小,例如:size:256
primaryKey 指定列为主键
unique 指定列为唯一
default 指定列的默认值
precision 指定列的精度
scale 指定列大小
not null 指定列为 NOT NULL
autoIncrement 指定列为自动增长
autoIncrementIncrement 自动步长,控制连续记录之间的间隔
embedded 嵌套字段
embeddedPrefix 嵌入字段的列名前缀
autoCreateTime 创建时追踪当前时间,对于 int 字段,它会追踪秒级时间戳,您可以使用 nano/milli 来追踪纳秒、毫秒时间戳,例如:autoCreateTime:nano
autoUpdateTime 创建/更新时追踪当前时间,对于 int 字段,它会追踪秒级时间戳,您可以使用 nano/milli 来追踪纳秒、毫秒时间戳,例如:autoUpdateTime:milli
index 根据参数创建索引,多个字段使用相同的名称则创建复合索引
uniqueIndex 创建的是唯一索引
check 创建检查约束,例如 check:age > 13
<- 设置字段写入的权限, <-:create 只创建、<-:update 只更新、<-:false 无写入权限、<- 创建和更新权限
-> 设置字段读的权限,->:false 无读权限
- 忽略该字段,- 无读写权限
comment 迁移时为字段添加注释

导入包

1
2
3
4
import (
"github.com/jinzhu/gorm"
_ "github.com/go-sql-driver/mysql"
)

连接mysql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var DatabaseSetting = struct {
Engine string
Host string
Port int
User string
Password string
Name string
TimeOut string
}{
Engine: "mysql",
Host: "103.21.116.89",
Port: 3306,
User: "root",
Password: "******",
Name: "db",
TimeOut: "10s",
}

dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local&timeout=%s",
settings.DatabaseSetting.User,
settings.DatabaseSetting.Password,
settings.DatabaseSetting.Host,
settings.DatabaseSetting.Port,
settings.DatabaseSetting.Name,
settings.DatabaseSetting.TimeOut)
db, err := gorm.Open(settings.DatabaseSetting.Engine, dsn)
if err != nil {
fmt.Println("connect db err,", err)
return
}
defer db.Close()

连接池

GORM 使用 database/sql 维护连接池

1
2
3
4
5
6
7
8
9
10
sqlDB, err := db.DB()

// SetMaxIdleConns 设置空闲连接池中连接的最大数量
sqlDB.SetMaxIdleConns(10)

// SetMaxOpenConns 设置打开数据库连接的最大数量。
sqlDB.SetMaxOpenConns(100)

// SetConnMaxLifetime 设置了连接可复用的最大时间。
sqlDB.SetConnMaxLifetime(time.Hour)

禁用复数形式

1
db.SingularTable(true)

为表名添加前缀

1
2
3
gorm.DefaultTableNameHandler= func(db *gorm.DB, defaultTableName string) string {
return "test_" +defaultTableName
}

设置打印日志

1
db.LogMode(true)

关于数据库sql.DB连接的几个参数优化

关于sql.DB,在建立和使用数据库连接方面有几个参数我们可以根据实际场景来进行优化一下,配置得当的话可以有效提高性能和降低系统资源消耗。

  • SetMaxOpenConns 用于设置最大打开的连接数,默认值为0,表示不限制。
  • SetMaxIdleConns 用于设置闲置的连接数,默认值为2;
  • SetConnMaxLifetime 可以限制一个连接使用的最大时长,默认值为0,表示不限制。
1
2
3
db.DB().SetMaxOpenConns(1000)
db.DB().SetMaxIdleConns(500)
db.DB().SetConnMaxLifetime(10*time.Minute)

参考:https://blog.csdn.net/moxiaomomo/article/details/105003475

gorm 关系 Many to Many 多对多

多对多(Many to Many)在两个模型之间增加一个 join 表(中间表)。

1
2
3
4
5
6
7
8
9
10

// User has and belongs to many languages, use `user_languages` as join table
type User struct {
gorm.Model
Languages []Language `gorm:"many2many:user_languages;"`
}

type Language struct {
gorm.Model
Name string

用 AutoMigrate 方法 User 表,会自动创建 user_languages 表,模式为:

1
2
3
4
5
CREATE TABLE "user_languages" (
"user_id" integer,
"language_id" integer,
PRIMARY KEY ("user_id","language_id")
);

参考:https://blog.csdn.net/weixin_33881140/article/details/92085805

查询

检索单个对象

GORM 提供了 FirstTakeLast 方法,以便从数据库中检索单个对象。当查询数据库时它添加了 LIMIT 1 条件,且没有找到记录时,它会返回 ErrRecordNotFound 错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 获取第一条记录(主键升序)
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;

// 获取一条记录,没有指定排序字段
db.Take(&user)
// SELECT * FROM users LIMIT 1;

// 获取最后一条记录(主键降序)
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;

result := db.First(&user)
result.RowsAffected // 返回找到的记录数
result.Error // returns error

// 检查 ErrRecordNotFound 错误
errors.Is(result.Error, gorm.ErrRecordNotFound)
-------------本文结束感谢您的阅读-------------