入门
模型定义
模型一般都是普通的 Golang 的结构体,Go的基本数据类型,或者指针。sql.Scanner 和 driver.Valuer,同时也支持接口。
例子:
type User struct { gorm.Model Name string Age sql.NullInt64 Birthday *time.Time Email string `gorm:"type:varchar(100);unique_index"` Role string `gorm:"size:255"` //设置字段的大小为255个字节 MemberNumber *string `gorm:"unique;not null"` // 设置 memberNumber 字段唯一且不为空 Num int `gorm:"AUTO_INCREMENT"` // 设置 Num字段自增 Address string `gorm:"index:addr"` // 给Address 创建一个名字是 `addr`的索引 IgnoreMe int `gorm:"-"` //忽略这个字段 }
惯例
我们要记住惯例大于配置,
gorm.Model
gorm.Model 是一个包含一些基本字段的结构体, 包含的字段有 ID,CreatedAt, UpdatedAt, DeletedAt。
你可以用它来嵌入到你的模型中,或者也可以用它来建立自己的模型。
// gorm.Model 定义 type Model struct { ID uint `gorm:"primary_key"` CreatedAt time.Time UpdatedAt time.Time DeletedAt *time.Time } // 将字段 `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt` 注入到 `User` 模型中 type User struct { gorm.Model Name string } // 声明 gorm.Model 模型 type User struct { ID int Name string }
ID 作为主键
GORM 默认使用 ID 作为主键名。
type User struct { ID string // 字段名 `ID` 将被作为默认的主键名 } // 设置字段 `AnimalID` 为默认主键 type Animal struct { AnimalID int64 `gorm:"primary_key"` Name string Age int64 }
复数表名
表名是结构体名称的复数形式
type User struct {} // 默认的表名是 `users` // 设置 `User` 的表名为 `profiles` func (User) TableName() string { return "profiles" } func (u User) TableName() string { if u.Role == "admin" { return "admin_users" } else { return "users" } } // 如果设置禁用表名复数形式属性为 true,`User` 的表名将是 `user` db.SingularTable(true)
指定表名
// 用 `User` 结构体创建 `delete_users` 表 db.Table("deleted_users").CreateTable(&User{}) var deleted_users []User db.Table("deleted_users").Find(&deleted_users) SELECT * FROM deleted_users; db.Table("deleted_users").Where("name = ?", "jinzhu").Delete() DELETE FROM deleted_users WHERE name = 'jinzhu';
修改默认表名
你可以通过定义 DefaultTableNameHandler 字段来对表名使用任何规则。
gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string { return "prefix_" + defaultTableName; }
蛇形列名
列名是字段名的蛇形小写形式
type User struct { ID uint // 字段名是 `id` Name string // 字段名是 `name` Birthday time.Time // 字段名是 `birthday` CreatedAt time.Time // 字段名是 `created_at` } // 重写列名 type Animal struct { AnimalId int64 `gorm:"column:beast_id"` // 设置列名为 `beast_id` Birthday time.Time `gorm:"column:day_of_the_beast"` // 设置列名为 `day_of_the_beast` Age int64 `gorm:"column:age_of_the_beast"` // 设置列名为 `age_of_the_beast` }
时间戳跟踪
CreatedAt
对于有 CreatedAt 字段的模型,它将被设置为首次创建记录的当前时间。
db.Create(&user) // 将设置 `CreatedAt` 为当前时间 // 你可以使用 `Update` 方法来更改默认时间 db.Model(&user).Update("CreatedAt", time.Now())
Up datedAt
对于有 UpdatedAt 字段的模型,它将被设置为记录更新时的当前时间。
db.Save(&user) // 将设置 `UpdatedAt` 为当前时间 db.Model(&user).Update("name", "jinzhu") // 将设置 `UpdatedAt` 为当前时间
DeletedAt
对于有 DeletedAt 字段的模型,当删除它们的实例时,它们并没有被从数据库中删除,只是将 DeletedAt 字段设置为当前时间。
CRUD接口
创建
创建记录
user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()} db.NewRecord(user) // => 返回 `true` ,因为主键为空 db.Create(&user) db.NewRecord(user) // => 在 `user` 之后创建返回 `false`
默认值
你可以通过标签定义字段的默认值,例如:
type Animal struct { ID int64 Name string `gorm:"default:'galeone'"` Age int64 }-
然后 SQL 会排除那些没有值或者有 零值 的字段,在记录插入数据库之后,gorm将从数据库中加载这些字段的值。
var animal = Animal{Age: 99, Name: ""} db.Create(&animal) // INSERT INTO animals("age") values('99'); // SELECT name from animals WHERE ID=111; // 返回的主键是 111 // animal.Name => 'galeone'
注意 所有包含零值的字段,像 0,’’,false 或者其他的 零值 不会被保存到数据库中,但会使用这个字段的默认值。你应该考虑使用指针类型或者其他的值来避免这种情况:
// Use pointer value type User struct { gorm.Model Name string Age *int `gorm:"default:18"` } // Use scanner/valuer type User struct { gorm.Model Name string Age sql.NullInt64 `gorm:"default:18"` }
在钩子中设置字段值
如果你想在 BeforeCreate 函数中更新字段的值,应该使用 scope.SetColumn,例如:
func (user *User) BeforeCreate(scope *gorm.Scope) error { scope.SetColumn("ID", uuid.New()) return nil }
创建额外选项
// 为插入 SQL 语句添加额外选项 db.Set("gorm:insert_option", "ON CONFLICT").Create(&product) // INSERT INTO products (name, code) VALUES ("name", "code") ON CONFLICT;
查询
查询
// 获取第一条记录,按主键排序 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; // 获取所有的记录 db.Find(&users) SELECT * FROM users; // 通过主键进行查询 (仅适用于主键是数字类型) db.First(&user, 10) SELECT * FROM users WHERE id = 10;
gorm 教程 一(2)https://developer.aliyun.com/article/1391736