1. 数据库迁移

1.1. 自动迁移

使用 migrate 来维持你的表结构一直处于最新状态。

警告:migrate 仅支持创建表、增加表中没有的字段和索引。为了保护你的数据,它并不支持改变已有的字段类型或删除未被使用的字段

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

1.2. 其他数据库迁移工具

GORM 的数据库迁移工具能够支持主要的数据库,但是如果你要寻找更多的迁移工具, GORM 会提供的数据库接口,这可能可以给到你帮助。

  1. // 返回 `*sql.DB`
  2. db.DB()

参考 通用接口 以获得更多详细说明

1.3. 表结构的方法

1.3.1. Has Table

  1. // 检查模型中 User 表是否存在
  2. db.HasTable(&User{})
  3. // 检查 users 表是否存在
  4. db.HasTable("users")

1.3.2. Create Table

  1. // 通过模型 User 创建表
  2. db.CreateTable(&User{})
  3. // 在创建 users 表的时候,会在 SQL 语句中拼接上 `"ENGINE=InnoDB"`
  4. db.Set("gorm:table_options", "ENGINE=InnoDB").CreateTable(&User{})

1.3.3. Drop table

  1. // 删除模型 User 表
  2. db.DropTable(&User{})
  3. // 删除 users 表
  4. db.DropTable("users")
  5. // 删除模型 User 表和 products 表
  6. db.DropTableIfExists(&User{}, "products")

1.3.4. ModifyColumn

以给定的值来定义字段类型

  1. // User 模型,改变 description 字段的数据类型为 `text`
  2. db.Model(&User{}).ModifyColumn("description", "text")

1.3.5. DropColumn

  1. // User 模型,删除 description 字段
  2. db.Model(&User{}).DropColumn("description")

1.3.6. Add Indexes

  1. // 为 `name` 字段建立一个名叫 `idx_user_name` 的索引
  2. db.Model(&User{}).AddIndex("idx_user_name", "name")
  3. // 为 `name`, `age` 字段建立一个名叫 `idx_user_name_age` 的索引
  4. db.Model(&User{}).AddIndex("idx_user_name_age", "name", "age")
  5. // 添加一条唯一索引
  6. db.Model(&User{}).AddUniqueIndex("idx_user_name", "name")
  7. // 为多个字段添加唯一索引
  8. db.Model(&User{}).AddUniqueIndex("idx_user_name_age", "name", "age")

1.3.7. Remove Index

  1. // 移除索引
  2. db.Model(&User{}).RemoveIndex("idx_user_name")

1.3.8. Add Foreign Key

  1. // 添加主键
  2. // 第一个参数 : 主键的字段
  3. // 第二个参数 : 目标表的 ID
  4. // 第三个参数 : ONDELETE
  5. // 第四个参数 : ONUPDATE
  6. db.Model(&User{}).AddForeignKey("city_id", "cities(id)", "RESTRICT", "RESTRICT")

1.3.9. Remove ForeignKey

  1. db.Model(&User{}).RemoveForeignKey("city_id", "cities(id)")