GORM 是 Go 语言的 ORM 包,功能强大,调用方便。很多大厂都在使用 GORM 来构建企业级的应用。GORM 的功能比较强大,基本可以满足我们开发中对数据库调用的各类需求。下面是我使用GORM链接MySQL的一些记录。
安装
安装
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
GORM支持多种关系数据库,例如 MySQL、Postgres、SQLite、SQLServer 等,根据使用需要安装不同的驱动即可。
连接
设置连接地址信息
dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
TablePrefix: "",
SingularTable: true, //使用单数表名,启用该选项后,User表将是 user
NameReplacer: nil,
NoLowerCase: false,
},
})
如果需要 GORM 正确地处理 time.Time 类型,在连接数据库时需要带上 parseTime 参数。如果要支持完整的 UTF-8 编码,可将charset=utf8更改为charset=utf8mb4。
GORM 支持连接池,底层是用 database/sql 包来维护连接池的,连接池设置如下:
sqlDB, err := db.DB()
sqlDB.SetMaxOpenConns(100) //最大连接数
sqlDB.SetMaxIdleConns(100) //最大空闲连接数
sqlDB.SetConnMaxLifetime(10 * time.Second) //空闲连接最多存活时间
自动迁移表结构
type User struct {
gorm.Model
Name string gorm:"column: name"
Age int gorm: "column: age"
Birthday time.Time gorm:"column: birthday"
}
//实现TableName方法可以修改表名
func (u *User) TableName() string {
return "user"
}
//自动迁移
db.AutoMigrate(&User{})
操作
增
user := User{
Name: "kuludi",
Age: 20,
Birthday: time.Now(),
}
result := db.Create(&user) //通过数据的指针来创建
db.Create 函数会返回如下 3 个值:
user.ID:返回插入数据的主键,这个是直接赋值给 user 变量。
result.Error:返回 error。
result.RowsAffected:返回插入记录的条数。
当需要插入的数据量比较大时,可以批量插入,以提高插入性能:
var users = []User{{Name: "red1"}, {Name: "red2"}, {Name: "red3"}}
db.Create(&users)
for _, user := range users {
fmt.Println(user.ID, user.Name) // 1 red1 2 red2 3 red3
}
删
我们可以通过 Delete 方法删除记录:
//delete from user where name = "red1"
db.Where("name = ?", "red1").Delete(&User{})
GORM 也支持根据主键进行删除,例如:
//delete from user where id = 1;
db.Delete(&User{}, 1)
不过,我更喜欢使用 db.Where 的方式进行删除,这种方式有两个优点。
第一个优点是删除方式更通用。使用 db.Where 不仅可以根据主键删除,还能够随意组合条件进行删除。
第二个优点是删除方式更显式,这意味着更易读。如果使用db.Delete(&User{}, 10),你还需要确认 User 的主键,如果记错了主键,还可能会引入 Bug。
改
GORM 中,最常用的修改方法如下:
db.First(&user)
user.Name = "hu"
user.Age = 300
db.Save(&user)
上述方法会保留所有字段,所以执行 Save 时,需要先执行 First,获取某个记录的所有列的值,然后再对需要更新的字段设置值。
还可以指定更新单个列:
db.Model(&User{}).Where("name = ?","hu").Update("age",500)
也可以指定更新多个列:
db.Model(&User{}).Where("name = ?", "hu").Updates(User{Name: "hong", Age: 888, Birthday: time.Now()})
这里要注意,这个方法只会更新非零值的字段。
查
GORM 支持不同的查询方法,下面我来讲解三种在开发中经常用到的查询方式,分别是检索单个记录、查询所有符合条件的记录和智能选择字段。
下面是检索单个记录的示例代码:
// 获取第一条记录(主键升序)
// SELECT * FROM users ORDER BY id LIMIT 1;
db.First(&user)
// 获取最后一条记录(主键降序)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;
db.Last(&user)
result := db.First(&user)
result.RowsAffected // 返回找到的记录数
result.Error // returns error
// 检查 ErrRecordNotFound 错误
errors.Is(result.Error, gorm.ErrRecordNotFound)
如果 model 类型没有定义主键,则按第一个字段排序。
总结
上面介绍了使用GORM连接数据库并实现简单的增删查改操作的记录,总的来说操作不是很困难,把必要的步骤和方法记住就好,数据库在开发中是很重要的一个环节,数据的保存和查询都需要用到数据库,好的数据库设计以及使用将大大提高程序的稳定性和实用性。所以我们要好好学习数据库相关的知识,为以后开发项目打下坚实基础!