前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GORM V2 自动迁移和迁移接口的方法

GORM V2 自动迁移和迁移接口的方法

作者头像
frank.
发布2020-09-10 00:30:36
3.8K0
发布2020-09-10 00:30:36
举报

01

概念

在项目开发中,我们可能会随时调整声明的模型,比如添加字段和索引,使用 GORM 的自动迁移功能,可以始终让我们的数据库表保持最新。此外,GORM 还提供了一些迁移接口的方法,可以帮助我们方便操作数据库表、字段和索引。

02

自动迁移

AutoMigrate 用于自动迁移您的 schema,保持您的 schema 是最新的。AutoMigrate 会创建表,缺少的外键,约束,列和索引,并且会更改现有列的类型(如果其大小、精度、是否为空可更改)。但不会删除未使用的列,以保护您的数据。

执行 AutoMigrate,需要先声明模型。

db.AutoMigrate(&User{})
db.AutoMigrate(&User{}, &Product{}, &Order{})
// 创建表时添加后缀
db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&User{})

AutoMigrate 会自动创建数据库外键约束,您可以在初始化时禁用此功能。

db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
  DisableForeignKeyConstraintWhenMigrating: true,
})

03

迁移接口的方法

  • 操作数据库 返回当前操作的数据库名
currentDBName := gormDB.Migrator().CurrentDatabase()
fmt.Printf("当前操作的数据库名:%s\n", currentDBName)
  • 操作数据库表 操作数据库表,必须先声明模型。
    • 创建数据表
err := gormDB.Migrator().CreateTable(&Student{})
if err != nil {
  fmt.Printf("创建数据库表失败,错误:%s\n", err)
  return
}
fmt.Println("创建数据库表成功")

默认情况下,GORM 会约定使用 ID 作为表的主键,可以通过标签 primaryKey 将其它字段设为主键。 通过将多个字段设为主键,以达到创建复合主键,整型字段设为主键,默认为启用 AutoIncrement,如果需要禁用,使用标签autoIncrement:false。 GORM 约定使用结构体名的复数形式作为表名,不过也可以根据需求修改,可以实现Tabler 接口来更改默认表名,不过这种方式不支持动态变化,它会被缓存下来以便后续使用,如果想要使用动态表名,可以使用Scopes,关于 Scopes 的使用方法,本文暂不展开。 GORM 约定使用结构体的字段名作为数据表的字段名,可以通过标签 column 修改。

  • 删除数据表

// gormDB.Migrator().DropTable("students")
gormDB.Migrator().DropTable(&Student{})
gormDB.Migrator().RenameTable("students", "stu")
// gormDB.Migrator().RenameTable(&Student{}, &Stu{})
  • 查询数据库表是否已存在
isExist := gormDB.Migrator().HasTable(&Student{})
// isExist := gormDB.Migrator().HasTable("students")
fmt.Printf("数据库表是否存在:%t\n", isExist)
  • 操作数据库表的字段
    • 添加字段 添加字段,必须先声明模型
type Student struct {
    Score uint
}
err := gormDB.Migrator().AddColumn(&Student{}, "Score")
if err != nil {
    fmt.Printf("添加字段错误,err:%s\n", err)
    return
}
  • 删除字段
gormDB.Migrator().DropColumn(&Student{}, "email")
  • 修改字段 与添加字段相同,必须先声明模型

type Student struct{
    Name string
    UserName string
}
gormDB.Migrator().RenameColumn(&Student{}, "name", "user_name")
  • 查询字段
isExistField := gormDB.Migrator().HasColumn(&Student{}, "name")
fmt.Printf("字段是否存在:%t\n", isExistField)
  • 操作数据库表的索引
    • 创建索引 创建索引,必须先在声明模型中,使用标签定义索引。 方式 1:
err = gormDB.Migrator().CreateIndex(&Student{}, "Name")
if err != nil {
  fmt.Printf("创建索引失败1,err:%s\n", err)
  return
}

方式 2:

err = gormDB.Migrator().CreateIndex(&Student{}, "idx_name")
if err != nil {
  fmt.Printf("创建索引失败2,err:%s\n", err)
  return
}
gormDB.Migrator().DropIndex(&Student{}, "idx_name")
// gormDB.Migrator().DropIndex(&Student{}, "UserName")
err = gormDB.Migrator().RenameIndex(&Student{}, "Name", "UserName")
if err != nil {
  fmt.Printf("修改索引名称失败,err:%s\n", err)
  return
}
修改索引名称失败,err:Error 1176: Key 'Name' doesn't exist in table 'students'
gormDB.Migrator().RenameIndex(&Student{}, "idx_name", "idx_user_name")
isExistIndex := gormDB.Migrator().HasIndex(&Student{}, "Name")
// isExistIndex := gormDB.Migrator().HasIndex(&Student{}, "idx_name")
fmt.Printf("查询索引是否存在:%t\n", isExistIndex)

迁移接口的方法,确实给开发工作带来了方便,但是个人建议除非特殊原因,否则尽量通过在声明模型中修改数据库表的字段和索引。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Go语言开发栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档