GORMGROM
GORM
模型定义
GROMstructGROMPost
type Post struct { PostId int Uid int Title string Content string Type int CreatedAt time.Time UpdatedAt time.Time } 复制代码
建立好一个结构体只是第一步,不过先不着急要怎么去建立数据表,咱们要先了解一下结构体与数据表之间的映射规则,主要有如下几点:bash
Struct tags
Gotagsencoding/jsonJSONtags
GROMtags
Column 指定列名 Type 指定列数据类型 Size 指定列大小, 默认值255 PRIMARY_KEY 将列指定为主键 UNIQUE 将列指定为惟一 DEFAULT 指定列默认值 PRECISION 指定列精度 NOT NULL 将列指定为非 NULL AUTO_INCREMENT 指定列是否为自增类型 INDEX 建立具备或不带名称的索引, 若是多个索引同名则建立复合索引 UNIQUE_INDEX 和 INDEX 相似,只不过建立的是惟一索引 EMBEDDED 将结构设置为嵌入 EMBEDDED_PREFIX 设置嵌入结构的前缀 - 忽略此字段 复制代码
GROM还支持一些关联数据表的tags约定,有机会我讲讲GROM数据表关联的时候,会说到的。ui
Posttags
type Post struct { PostId int `gorm:"primary_key;auto_increment"` Uid int `gorm:"type:int;not null"` Title string `gorm:"type:varchar(255);not null"` Content string `gorm:"type:text;not null"` Type uint8 `gorm:"type:tinyint;default 1;not null"` CreatedAt time.Time UpdatedAt time.Time DeletedAt time.Time } 复制代码
GORMtags
惯例
tags
主键
IDTestModelIDTestModelIDstringIDintAUTO_INCREMENTID
type TestModel struct{ ID int Name string } 复制代码
PostPostIdIDGROMID
type Post struct { ID int PostId int `gorm:"primary_key;auto_increment"` Uid int `gorm:"type:int;not null"` Title string `gorm:"type:varchar(255);not null"` Content string `gorm:"type:text;not null"` Type uint8 `gorm:"type:tinyint;default 1;not null"` CreatedAt time.Time UpdatedAt time.Time DeletedAt time.Time } 复制代码
PostIDPostIddesc posts
数据表映射规则
Postposts
TableName()
//指定Post结构体对应的数据表为my_posts func (p Post) TableName() string{ return "my_posts" } 复制代码
数据表前缀
gorm.DefaultTableNameHandler
gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string { return "tb_" + defaultTableName; } 复制代码
Posttb_posts
字段映射规则
结构体到数据表的名称映射规则为结构体名称的复数,而结构体的字段到数据表字段的默认映射规则是用下划线分隔每一个大写字母开头的单词,以下:
type Prize struct { ID int PrizeName string } 复制代码
PrizePrizeNameprize_namePrizeNamePrizenameprizename
tagstags
时间点追踪
IDGORMCreatedAtUpdatedAtDeletedAtGROM
CreatedAt:新增数据表记录的时候,会自动写入这个字段。 UpdatedAt:更新数据表记录的时候,会自动更新这个字段。 DeletedAt:当执行软删除的时候,会自动更新这个字段,表示删除时间 复制代码
gorm.Model
IDCreatedAtUpdatedAtDeletedAtGORMgorm.Modelgorm.Model
type Model struct { ID uint `gorm:"primary_key"` CreatedAt time.Time UpdatedAt time.Time DeletedAt *time.Time `sql:"index"` } 复制代码
Prizegorm.Model
type Prize struct{ gorm.Model Name string } 复制代码
Prize
数据库迁移
GROM
GORM
数据表操做
//根据模型自动建立数据表 func (s *DB) AutoMigrate(values ...interface{}) *DB //根据模型建立数据表 func (s *DB) CreateTable(models ...interface{}) *DB //删除数据表,至关于drop table语句 func (s *DB) DropTable(values ...interface{}) *DB //至关于drop table if exsist 语句 func (s *DB) DropTableIfExists(values ...interface{}) *DB //根据模型判断数据表是否存在 func (s *DB) HasTable(value interface{}) bool 复制代码
列操做
//删除数据表字段 func (s *DB) DropColumn(column string) *DB //修改数据表字段的数据类型 func (s *DB) ModifyColumn(column string, typ string) *DB 复制代码
索引操做
//添加外键 func (s *DB) AddForeignKey(field string, dest string, onDelete string, onUpdate string) *DB //给数据表字段添加索引 func (s *DB) AddIndex(indexName string, columns ...string) *DB //给数据表字段添加惟一索引 func (s *DB) AddUniqueIndex(indexName string, columns ...string) *DB 复制代码
数据迁移简单代码示例
dbgorm.DB
type User struct { Id int //对应数据表的自增id Username string Password string Email string Phone string } func main(){ db.AutoMigrate(&Post{},&User{})//建立posts和users数据表 db.CreateTable(&Post{})//建立posts数据表 db.Set("gorm:table_options", "ENGINE=InnoDB").CreateTable(&Post{})//建立posts表时指存在引擎 db.DropTable(&Post{},"users")//删除posts和users表数据表 db.DropTableIfExists(&Post{},"users")//删除前会判断posts和users表是否存在 //先判断users表是否存在,再删除users表 if db.HasTable("users") { db.DropTable("users") } //删除数据表字段 db.Model(&Post{}).DropColumn("id") //修改字段数据类型 db.Model(&Post{}).ModifyColumn("id","varchar(255)") //创建posts与users表之间的外键关联 db.Model(&Post{}).AddForeignKey("uid", "users(id)", "RESTRICT", "RESTRICT") //给posts表的title字段添加索引 db.Model(&Post{}).AddIndex("index_title","title") //给users表的phone字段添加惟一索引 db.Model(&User{}).AddUniqueIndex("index_phone","phone") } 复制代码
小结
GROM
你的关注,是我写做路上最大的鼓励!