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)
迁移接口的方法,确实给开发工作带来了方便,但是个人建议除非特殊原因,否则尽量通过在声明模型中修改数据库表的字段和索引。
- 同步服务器系统时间操作记录
- kvm虚拟化管理平台WebVirtMgr部署-完整记录(安装Windows虚拟机)-(4)
- ExtJs学习笔记(11)_Absolute布局和Accordion布局
- ExtJs学习笔记(9)_Window的基本用法
- DateTime在ExtJs中无法正确序列化的问题
- ELK实时日志分析平台环境部署--完整记录
- 梳理Linux下OSI七层网络与TCP/IP五层网络架构
- 字符编码-使用c#研究
- iframe高度自适应的IE解决方案
- javascript读写本机文本文件
- 崔立鹏:腾讯云为知识竞技游戏提供解决方案
- Mysql之binlog日志说明及利用binlog日志恢复数据操作记录
- 常用的AJAX弹出层代码
- Linux下检测IP地址冲突及解决方法
- 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 数组属性和方法
- 面试再问 HashMap,求你把这篇文章发给他!
- FestIN:一款功能强大的S3 Buckets数据内容搜索工具
- 一天一大 leet(地下城游戏)难度:困难-Day20200712
- 【MongoDB】mongodb4.4版本新特性
- 一天一大 leet(数组中的第 K 个最大元素)难度:中等 DAY-29
- 线程之生产者消费者模式
- Redis学习笔记 -- 2
- 一天一大 leet(单词拆分)难度:中等 DAY-25
- 多线程必考的「生产者 - 消费者」模型,看乔戈里这篇文章就够了
- 一天一大 leet(三角形最小路径和)难度:中等-Day20200715
- 一天一大 leet(将有序数组转换为二叉搜索树)难度:简单-Day20200703
- 一天一大 leet(缺失的第一个正数)难度:困难DAY-27
- 【玩转Redis面试第3讲】一次性将Redis RDB持久化和AOF持久化讲透
- 一天一大 leet(用两个栈实现队列)难度:简单 DAY-30
- SpringBoot实战:整合Redis、mybatis,封装RedisUtils工具类等(附源码)