GORM V2 自动迁移和迁移接口的方法
时间:2022-07-24
本文章向大家介绍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("当前操作的数据库名:%sn", currentDBName)
- 操作数据库表
操作数据库表,必须先声明模型。
- 创建数据表
err := gormDB.Migrator().CreateTable(&Student{})
if err != nil {
fmt.Printf("创建数据库表失败,错误:%sn", 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("数据库表是否存在:%tn", isExist)
- 操作数据库表的字段
- 添加字段 添加字段,必须先声明模型
type Student struct {
Score uint
}
err := gormDB.Migrator().AddColumn(&Student{}, "Score")
if err != nil {
fmt.Printf("添加字段错误,err:%sn", 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("字段是否存在:%tn", isExistField)
- 操作数据库表的索引
- 创建索引 创建索引,必须先在声明模型中,使用标签定义索引。 方式 1:
err = gormDB.Migrator().CreateIndex(&Student{}, "Name")
if err != nil {
fmt.Printf("创建索引失败1,err:%sn", err)
return
}
方式 2:
err = gormDB.Migrator().CreateIndex(&Student{}, "idx_name")
if err != nil {
fmt.Printf("创建索引失败2,err:%sn", 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:%sn", 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("查询索引是否存在:%tn", isExistIndex)
迁移接口的方法,确实给开发工作带来了方便,但是个人建议除非特殊原因,否则尽量通过在声明模型中修改数据库表的字段和索引。
- WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer)
- silverlight向服务器post数据类
- WCF技术剖析之十三:序列化过程中的已知类型(Known Type)
- 44 Amazing Silverlight 2.0 Screencasts
- CaseStudy(showcase)类库篇-用agTweener来实现动画效果
- CaseStudy(showcase)数据篇-Loading的制作
- CaseStudy(showcase)数据篇-加载图片
- CaseStudy(showcase)数据篇-从XML中获取数据
- CaseStudy(showcase)布局篇-全屏效果
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(12)-系统日志和异常的处理②
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(14)-EasyUI缺陷修复与扩展
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(10)-系统菜单栏[附源码]
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(8)-MVC与EasyUI DataGrid 分页
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(5)-EF增删改查
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- linux下日志定时轮询的流程详解
- Vim中查找替换及正则表达式的使用详解
- CentOS 7下部署php7.1和开启MySQL扩展的方法教程
- Ubuntu系统下用Crontab命令定时执行PHP文件详解
- CentOS7 LNMP+phpmyadmin环境搭建 第三篇phpmyadmin安装
- Linux有限状态机FSM的理解与实现
- Linux下浅谈crond与crontab的命令用法
- centos 7系统下安装Jenkins的步骤详解
- linux tomcat配置https的方法
- Linux 中firewall的使用方法总结
- CentOS 7 安装vsftpd 服务器的具体操作步骤
- 详细介绍通过配置Apache实现404页面替换
- bug分支和feature分支_动力节点Java学院整理
- Linux下Python脚本自启动与定时任务详解
- Linux服务器tomact 8.0启动慢的完美解决方法