GORM实践|青训营
GORM(Go Relational Object Mapping)可以让go语言开发者快速,高效的完成对数据库的一系列操作,不管是Postgre,还是mysql等等数据库都兼容,作者是字节跳动的张金柱老师。
下面是实践内容:
//经典学生表
CREATE TABLE `student`
(
`Id` bigint(20) NOT NULL AUTO_INCREMENT,
`Name` varchar(20) NOT NULL,
`score` float NOT NULL,
PRIMARY KEY (`Id`)
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8mb4
gorm也有建库方法,不过我们一般不用。
一般我们会建一个go文件来初始化数据库,其中的配置也可以通过读取配置文件来获取,也可以硬编码,记得在入口函数,也就是main方法上使用初始化函数,我就经常忘记,导致会出现空指针异常。
runtime error: invalid memory address or nil pointer dereference
var db *gorm.DB
func InitGormDB() (err error) {
dB, err := gorm.Open(mysql.New(mysql.Config{
DSN: fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
global.Settings.GormInfo.Name, global.Settings.GormInfo.Password, global.Settings.GormInfo.Host, global.Settings.GormInfo.Port, global.Settings.GormInfo.DBName), // DSN data source name
DefaultStringSize: 171,
DisableDatetimePrecision: true,
DontSupportRenameIndex: true,
}), &gorm.Config{
SkipDefaultTransaction: false,
DisableForeignKeyConstraintWhenMigrating: true,
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
},
})
if err != nil {
fmt.Printf("连接失败:%v\n", err)
}
db = dB
return err
}
表创建好了,数据库连接配置也初始化好了,下面就是分析他的各种API了。以下示例是网上抄的,仅做代码分析
//Select方法的作用是选择你操作数据库时需要的字段,比如下面的Student结构体其实有五个字段,但因为用了Select方法,所以他在创建一条新数据的时候,剩下两个字段或为空,或为默认值。
db.Select("Name", "Password", "MajorNum").Create(&model.Student{Name: user.Name, Password: user.Password, MajorNum: user.MajorNum})
当然也有和它对应的,如果你有不需要的字段,可以用以下函数排除掉
db.Omit("Name", "Age", "CreatedAt").Create(&user)
另外Create方法还有一个返回值,我们可以通过判断返回插入记录的条数是否>1来判断插入是否成功
result := db.Create(&user) // 通过数据的指针来创建
user.ID // 返回插入数据的主键
result.Error // 返回 error
result.RowsAffected // 返回插入记录的条数
下面的函数是用来查询单条记录,都是官网的示例,看官方示例来学习是最快捷的方式。
// 获取第一条记录(主键升序)
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 or nil
还挑了一些比较常用的,一般第二个参数是切片或数组,映射到数据库都是范围查询
db.First(&user, "10")
// SELECT * FROM users WHERE id = 10;
db.Find(&users, []int{1,2,3})
// SELECT * FROM users WHERE id IN (1,2,3);
查询是操作数据库最频繁的手段,所以重点讲了查询方面的API,更新和删除略过,更多内容可以通过官方文档和社区学习。