GORM基本使用

官方文档(中文):
GORM 指南 | GORM
数据库链接
db, err := gorm.Open(mysql.New(mysql.Config{DSN: "gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8&parseTime=True&loc=Local", // DSN data source nameDefaultStringSize: 256, // string 类型字段的默认长度DisableDatetimePrecision: true, // 禁用 datetime 精度 , MySQL 5.6 之前的数据库不支持DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式 , MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引DontSupportRenameColumn: true, // 用 `change` 重命名列 , MySQL 8 之前的数据库和 MariaDB 不支持重命名列SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置}), &gorm.Config{})
数据库迁移
db.AutoMigrate(&User{}, &Product{}, &Order{})
绑定数据库默认约定规则
gorm自动迁移数据库 , 自动数据库的表名、列名和结构体名、字段名绑定 。gorm的绑定规则是约定的 , 不是配置的 。gorm默认约定规则:
按照默认约定定义结构体 , 使用自动迁移方法 , 可以创建对应的表结构 。
修改默认约定规则
使用go语言的tag标签能修改以下内容:
type Animal struct {UUIDstring `gorm:"primaryKey"` //设置主键Ageint64`gorm:"column:user_age"` //设置列名}
修改结构体对应的表名称:
func (User) TableName() string {return "user_name"}
db.Table("user_table").AutoMigrate(&User{})var users[]Userdb.Table("user_table").Find(&users)
创建
增删改查的基本操作中 , where()方法用来添加条件 。model()方法用来指定模型 , 选择要查询的表名 , 一般参数是会自动选择表名 , 参数是map和slice需要指定model 。
插入一条数据
user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}result := db.Create(&user) // 通过数据的指针来创建
批量插入
var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}}db.Create(&users) //不指定批数量db.CreateInBatches(users, 100) //或者 , 指定批数量100
使用map作为数据源创建
db.Model(&User{}).Create([]map[string]interface{}{{"Name": "jinzhu_1", "Age": 18},{"Name": "jinzhu_2", "Age": 20},})
更新
Save会保存所有的字段 , 即使字段是零值
user.Name = "jinzhu 2"user.Age = 100db.Save(&user)// UPDATE users SET name='jinzhu 2', age=100, birthday='2016-01-01', // updated_at = '2013-11-17 21:34:10' WHERE id=111;
更新任意条记录 。支持和map , 使用只更新非零字段 。没有设置条件时 , 返回e错误 。
// user 的 ID 是 `111` ,  默认更新一条db.Model(&user).Updates(User{Name: "hello", Age: 18, Active: false})// UPDATE users SET name='hello', age=18, updated_at = '2013-11-17 21:34:10' WHERE id = 111;db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})// UPDATE users SET name='hello', age=18, active=false, updated_at='2013-11-17 21:34:10' WHERE id=111;//user的ID为空 , 更新多条记录db.Model(User{}).Where("role = ?", "admin").Updates(User{Name: "hello", Age: 18})// UPDATE users SET name='hello', age=18 WHERE role = 'admin';
删除
没有设置条件时 , 返回e错误 。
//email.id=10db.Where("name = ?", "jinzhu").Delete(&email)// DELETE from emails where id = 10 AND name = "jinzhu";
软删除:模型包含了一个gorm.字段(gorm.Model已经包含了该字段) , 将自动获得软删除的能力 。软删除默认调用时 , 记录不会从数据库中被真正删除 ,  会将置为当前时间 ,  并且你不能再通过查询方法找到该记录 。