Gorm迁移使用golang-migrate/migrate

16

我决定使用gorm作为我的ORM。我想要使用golang-migrate/migrate进行迁移,因为 GORM 似乎没有版本化的迁移文件。而且我更喜欢使用 CLI 进行迁移,而不是使用自动迁移。

我阅读了 gorm 的文档,但没看到 gorm 如何将模型转换成 SQL 表格的说明。是否有任何关于gorm生成的SQL表格的示例或文档?(特别是类型或关联如何映射到SQL)


1
这是您要找的吗?https://gorm.io/docs/migration.html#Auto-Migration 它说: "AutoMigrate将创建表、缺失的外键、约束、列和索引。如果更改了现有列的大小、精度或可空性,则会更改其类型。它不会删除未使用的列以保护您的数据。" - Emin Laletovic
嘿,伙计!你能用CLI运行迁移了吗? - Lucas Dalmarco
6个回答

3
当我几年前开始使用Gorm时,我也在寻找与您类似的东西。最终我使用了一个叫做goose的包 (https://github.com/pressly/goose) 来创建迁移文件并从CLI运行迁移。它实际上非常好用。基本上,在您的updown函数中,您可以使用gorm内置的迁移函数 (https://gorm.io/docs/migration.html)。
以下是使用gorm的goose迁移文件示例。
package main

import (
    "database/sql"
    "encoding/json"
    "my-api/internal/pkg/db"
    "time"

    "my-api/internal/pkg/private/models"

    "github.com/pressly/goose"
)

func init() {
    goose.AddMigration(Up00007, Down00007)
}

type Event struct {
    models.DefaultModel
    VenueID        uint            `gorm:"not null"`
    Tags           json.RawMessage `gorm:"not null;type:json" sql:"type:json"`
    Name           string          `gorm:"not null"`
    Details        string          `gorm:"not null"`
    Picture        string          `gorm:"not null"`
    StartDate      time.Time
    EndDate        time.Time
}

func Up00007(tx *sql.Tx) error {
    // This code is executed when the migration is applied.
    return db.Get().CreateTable(&Event{}).Error
}

func Down00007(tx *sql.Tx) error {
    // This code is executed when the migration is rolled back.
    return db.Get().DropTable(&Event{}).Error
}

请注意,db.Get()是获取gorm数据库的方法。


1

Atlas支持 GORM的自动迁移规划

使用Atlas,您可以从GORM模型自动生成版本化迁移。您可以生成Atlas格式的迁移以便在Atlas中应用,或者如果您想要使用golang-migrate,则Atlas也可以生成该格式的迁移。

祝好!

(完全透明:我是作者之一)


0
阅读gorm文档,但我没有看到gorm如何将模型转换为SQL表。是否有关于gorm生成的SQL表的示例或文档?(特别是类型或关联如何映射到SQL)。
请查看“声明模型”段落:
列数据类型,优先使用兼容的通用类型,例如:bool、int、uint、float、string、time、bytes,这适用于所有数据库,并且可以与其他标签一起使用,例如not null、size、autoIncrement等。支持指定数据库数据类型,例如varbinary(8),当使用指定的数据库数据类型时,它需要是完整的数据库数据类型,例如:MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT。
例如:
type Post struct {
  ID     uuid.UUID `gorm:"type:uuid;default:uuid_generate_v4()"`
  Title  string
  Tags   pq.StringArray `gorm:"type:text[]"`
}

另外,请查看自定义数据类型章节。


0

Gorm中没有直接的解决方案来自动生成SQL。在golang-migrate/migrate中,您需要为每个版本编写升级/降级迁移版本的up和down SQL脚本,并且不能使用gorm来生成这些文件。

您应该手动同步您的Gorm模型与迁移脚本。


0

有一种hacky的方法可以从Gorm自动迁移中获取SQL代码。您可以在Gorm创建阶段注入您的记录器(请参见文档),然后在所有模型更改后编译您的应用程序。不要忘记为记录器设置Info严重性。然后,自动迁移SQL应该在记录器输出中。然后您需要将其复制粘贴到迁移文件中。


-1

哦,我明白了,因为我在使用Go语言方面也是新手。如果你从像Laravel或Django这样的框架迁移而来,你会感觉到一些不同。

你可以在另一个应用程序中设计方案,如https://dbdiagram.io/home,并导出SQL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接