Go语言 ORM-gorm 学习笔记(二)
go version go1.13
惯例约定 gorm.model gorm.model
是一个包含了ID
,CreatedAt
,UpdatedAt
,DeletedAt
四个字段的Golang结构体。你可以将它嵌入到你自己的模型中,当然你也可以完全使用自己的模型。
1 2 3 4 5 6 7 // gorm.Model 定义 type Model struct { ID unit `gorm:"primary_key"` // 字段名为 ID 的字段默认作为表的主键 CreatedAt time.Time UpdatedAt time.Time DeletedAt *time.Time }
ID作为主键 GORM默认会使用名为ID的字段作为表的主键。
1 2 3 4 5 6 7 8 9 10 11 type User struct { ID string // 名为ID的字段会默认作为表的主键 Name string } // 使用AnimalID作为主键 type Animal struct { AnimalID int64 `gorm:"primary_key"` Name string Age int64 }
表名 表名默认就是结构体名称的复数,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 type User struct {} // 默认表名是users // 将User的表名设置为profiles func (User) TableName () string { if u.Role == "admin" { return "admin_users" } else { return "users" } } // 禁用默认表名的复数形式,如果设置true,则User的默认表名是user db.SingularTable(true)
指定表名称 1 2 3 4 5 6 7 8 9 // 使用User结构体创建名为deleted_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';
更改默认表名(table name) 你可以通过定义DefaultTableNameHandler来设置默认表名的命名规则
1 2 3 gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string { return "prefix_" + defaultTableName; }
迁移(数据表操作) 自动迁移 自动迁移你的模型,使之保持最新状态。
警告:自动迁移只会创建表、缺失的列、缺失的索引,不会更改现有列的类型或删除未使用的列,以此来保护您的数据。
1 2 3 4 5 db.AutoMigrate(&User{}) db.AutoMigrate(&User{}, &Product{}, &Order{}) // 可同时创建多张表 // 创建表时添加表后缀 db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&User{})
模型方法 Has Table 1 2 3 4 5 // 检查模型User的表是否存在 db.HasTable(&User{}) // 检查表users是否存在 db.HasTable("users")
Create Table 1 2 3 4 5 // 为模型User创建表 db.CreateTable(&User{}) // 创建表时会追加ENGINE=InnoDB到SQL语句中 db.Set("gorm:table_options", "ENGINE=InnoDB").CreateTable(&User{})
Drop Table 1 2 3 4 5 6 7 8 // 删除模型User的表 db.DropTable(&User{}) // 删除表users db.DropTable("users") // 删除模型User的表和表products db.DropTableIfExists(&User{}, "products") // 删除多张表,如果表存在则删除
ModifyColumn 修改列类型为给定的值
1 2 // 修改模型User的description列的类型为text db.Model(&User{}).ModifyColumn("description", "text")
DropColumn 1 2 // 删除模型User的description列 db.Model(&User{}).DropColumn("description")
Add Indexes 添加索引
1 2 3 4 5 6 7 8 9 10 11 // 为name列添加名为idx_user_name的普通索引 db.Model(&User{}).AddIndex("idx_user_name", "name") // 为name和age两列添加名为idx_user_name_age的复合索引 db.Model(&User{}).AddIndex("idx_user_name_age", "name", "age") // 添加唯一索引 db.Model(&User{}).AddUniqueIndex("idx_user_name", "name") // 为多列添加唯一索引 db.Model(&User{}).AddUniqueIndex("idx_user_name_age", "name", "age")
Remove Index 1 2 // 删除索引 db.Model(&User{}).RemoveIndex("idx_user_name")