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

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

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")
  • 修改索引与创建索引相同,修改索引,也必须先在声明模型中,使用标签定义索引。方式 1:(未执行成功,可能是 GORM V2 的 BUG)
err = gormDB.Migrator().RenameIndex(&Student{}, "Name", "UserName")
if err != nil {
  fmt.Printf("修改索引名称失败,err:%s\n", err)
  return
}

方式 1,错误信息:


修改索引名称失败,err:Error 1176: Key 'Name' doesn't exist in table 'students'

方式 2:


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)


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





目录
相关文章
|
6月前
|
关系型数据库 MySQL 数据库连接
gorm连接mysql数据库以及建表和自动迁移
gorm连接mysql数据库以及建表和自动迁移
100 0
|
6月前
|
关系型数据库 数据库 RDS
如果源数据库和目标数据库中都存在sequence的column且在迁移过程中没有新增的话
如果源数据库和目标数据库中都存在sequence的column且在迁移过程中没有新增的话
48 1
|
4月前
|
存储 弹性计算 Serverless
Serverless 应用引擎使用问题之如何解决在回滚之后实例部署信息中没有显示任何实例
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
4月前
|
关系型数据库 分布式数据库 PolarDB
PolarDB产品使用问题之创建只读实例,在尝试修改数据时遇到了错误,该如何处理
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
3月前
|
存储 Serverless API
Serverless 架构实现弹幕场景问题之在initializer方法中初始化数据库实例如何解决
Serverless 架构实现弹幕场景问题之在initializer方法中初始化数据库实例如何解决
29 0
|
5月前
|
运维 DataWorks Oracle
DataWorks产品使用合集之在标准模式下,当同步Oracle的表或视图时,是否需要在源端的测试和生产环境中都存在要同步的表或视图
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
47 3
|
5月前
|
SQL 分布式计算 MaxCompute
MaxCompute操作报错合集之通过UDF(用户定义函数)请求外部数据库资源并遇到报错,是什么原因
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
254 0
|
6月前
|
存储 SQL 数据库
数据库库表结构设计:原理、实例与最佳实践
数据库库表结构设计:原理、实例与最佳实践
2129 0
|
6月前
|
SQL 分布式计算 DataWorks
如果你在DataWorks中使用ODPS SQL时遇到"该文件对应引擎实例已失效,请重新选择可用的引擎实例"的错误提示
如果你在DataWorks中使用ODPS SQL时遇到"该文件对应引擎实例已失效,请重新选择可用的引擎实例"的错误提示
100 1
|
SQL 缓存 搜索推荐
Gorm学习(三)基础:迁移(数据库建表以及字段设置)
在项目开发中,我们可能会随时调整声明的模型,比如添加字段和索引,使用 GORM 的自动迁移功能,可以始终让我们的数据库表结构保持最新。
1175 0
Gorm学习(三)基础:迁移(数据库建表以及字段设置)
下一篇
无影云桌面