GORM——AutoMigrate

AutoMigrate 用于自动迁移您的 schema,保持您的 schema 是最新的。

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

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

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

1db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{ 2 3 DisableForeignKeyConstraintWhenMigrating: true, 4 5})

Migrator 接口

GORM 提供了 Migrator 接口,该接口为每个数据库提供了统一的 API 接口,可用来为您的数据库构建独立迁移,例如:

SQLite 不支持 ALTER COLUMNDROP COLUMN,当你试图修改表结构,GORM 将创建一个新表、复制所有数据、删除旧表、重命名新表。

一些版本的 MySQL 不支持 rename 列,索引。GORM 将基于您使用 MySQL 的版本执行不同 SQL

1type Migrator interface { 2 // AutoMigrate 3 AutoMigrate(dst ...interface{}) error 4 5 // Database 6 CurrentDatabase() string 7 FullDataTypeOf(*schema.Field) clause.Expr 8 9 // Tables 10 CreateTable(dst ...interface{}) error 11 DropTable(dst ...interface{}) error 12 HasTable(dst interface{}) bool 13 RenameTable(oldName, newName interface{}) error 14 15 // Columns 16 AddColumn(dst interface{}, field string) error 17 DropColumn(dst interface{}, field string) error 18 AlterColumn(dst interface{}, field string) error 19 MigrateColumn(dst interface{}, field *schema.Field, columnType ColumnType) error 20 HasColumn(dst interface{}, field string) bool 21 RenameColumn(dst interface{}, oldName, field string) error 22 ColumnTypes(dst interface{}) ([]ColumnType, error) 23 24 // Views 25 CreateView(name string, option ViewOption) error 26 DropView(name string) error 27 28 // Constraints 29 CreateConstraint(dst interface{}, name string) error 30 DropConstraint(dst interface{}, name string) error 31 HasConstraint(dst interface{}, name string) bool 32 33 // Indexes 34 CreateIndex(dst interface{}, name string) error 35 DropIndex(dst interface{}, name string) error 36 HasIndex(dst interface{}, name string) bool 37 RenameIndex(dst interface{}, oldName, newName string) error 38}

当前数据库

返回当前使用的数据库名

db.Migrator().CurrentDatabase()

1// Create table for `User` 2 3db.Migrator().CreateTable(&User{}) 4 5// Append "ENGINE=InnoDB" to the creating table SQL for `User` 6 7db.Set("gorm:table_options", "ENGINE=InnoDB").Migrator().CreateTable(&User{}) 8 9// Check table for `User` exists or not 10 11db.Migrator().HasTable(&User{}) 12 13db.Migrator().HasTable("users") 14 15// Drop table if exists (will ignore or delete foreign key constraints when dropping) 16 17db.Migrator().DropTable(&User{}) 18 19db.Migrator().DropTable("users") 20 21// Rename old table to new table 22 23db.Migrator().RenameTable(&User{}, &UserInfo{}) 24 25db.Migrator().RenameTable("users", "user_infos")

1type User struct { 2 3 Name string 4 5} 6 7// 添加 name 字段 8 9db.Migrator().AddColumn(&User{}, "Name") 10 11// 删除 name 字段 12 13db.Migrator().DropColumn(&User{}, "Name") 14 15// 修改 name 字段 16 17db.Migrator().AlterColumn(&User{}, "Name") 18 19// 检查字段是否存在 20 21db.Migrator().HasColumn(&User{}, "Name") 22 23type User struct { 24 25 Name string 26 27 NewName string 28 29} 30 31// 重命名字段 32 33db.Migrator().RenameColumn(&User{}, "Name", "NewName") 34 35db.Migrator().RenameColumn(&User{}, "name", "new_name") 36 37// 获取字段类型 38 39db.Migrator().ColumnTypes(&User{}) ([]*sql.ColumnType, error)

约束

1type UserIndex struct { 2 3 Name string `gorm:"check:name_checker,name <> 'jinzhu'"` 4 5} 6 7// 创建约束 8 9db.Migrator().CreateConstraint(&User{}, "name_checker") 10 11// 删除约束 12 13db.Migrator().DropConstraint(&User{}, "name_checker") 14 15// 检查约束是否存在 16 17db.Migrator().HasConstraint(&User{}, "name_checker")

索引

1type User struct { 2 3 gorm.Model 4 5 Name string `gorm:"size:255;index:idx_name,unique"` 6 7} 8 9// 为 Name 字段创建索引 10 11db.Migrator().CreateIndex(&User{}, "Name") 12 13db.Migrator().CreateIndex(&User{}, "idx_name") 14 15// 为 Name 字段删除索引 16 17db.Migrator().DropIndex(&User{}, "Name") 18 19db.Migrator().DropIndex(&User{}, "idx_name") 20 21// 检查索引是否存在 22 23db.Migrator().HasIndex(&User{}, "Name") 24 25db.Migrator().HasIndex(&User{}, "idx_name") 26 27type User struct { 28 29 gorm.Model 30 31 Name string `gorm:"size:255;index:idx_name,unique"` 32 33 Name2 string `gorm:"size:255;index:idx_name_2,unique"` 34 35} 36 37// 修改索引名 38 39db.Migrator().RenameIndex(&User{}, "Name", "Name2") 40 41db.Migrator().RenameIndex(&User{}, "idx_name", "idx_name_2")

约束

GORM 会在自动迁移和创建表时创建约束,查看 约束数据库索引 获取详情

其他迁移工具

GORM 的 AutoMigrate 在大多数情况下都工作得很好,但如果您正在寻找更严格的迁移工具,GORM 提供一个通用数据库接口,可能对您有帮助。

1// returns `*sql.DB` 2 3db.DB()

查看 通用接口 获取详情。

本文同步分享在 博客“羊羽”(other)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

一篇文章带你了解JavaScript日期

日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用

GORM——AutoMigrate - HelloWorld