使用golang-migrate/migrate进行Gorm迁移

nue99wik  于 2022-12-07  发布在  Go
关注(0)|答案(5)|浏览(633)

我决定使用gorm作为我的ORM。我想使用golang-migrate/migrate进行迁移,因为GORM似乎没有版本化的迁移文件。我宁愿使用CLI进行迁移,而不是使用自动迁移。
我看了gorm的文档,但是我没有看到gorm是如何把模型转换成SQL表的。有没有关于gorm生成的SQL表的示例或文档?(特别是类型或关联如何Map到SQL)

w8ntj3qf

w8ntj3qf1#

我看了gorm的文档,但是我没有看到gorm是如何把模型转换成SQL表的。有没有关于gorm生成的SQL表的例子或文档?(特别是类型或关联如何Map到SQL)
查看“声明型号”段落:
列数据类型,最好使用兼容通用类型,例如:bool、int、uint、float、string、time、bytes,适用于所有数据库,可与其他标签一起使用,如not null、size、autoIncrement...也支持指定的数据库数据类型,如varbinary(8),使用指定的数据库数据类型时,需要是完整的数据库数据类型,例如:介质INT未签名非空AUTO_INCREMENT
比如说

type Post struct {
  ID     uuid.UUID `gorm:"type:uuid;default:uuid_generate_v4()"`
  Title  string
  Tags   pq.StringArray `gorm:"type:text[]"`
}

👉🏻 同样,请看Customize Data Types段落。

w8f9ii69

w8f9ii692#

在golang-migrate/migrate中,你应该为每个版本编写升级/降级迁移版本的up和down SQL脚本,你不能使用gorm来生成这些文件。
你应该保持你的gorm模型与迁移脚本手动同步。

7y4bm7vi

7y4bm7vi3#

几年前我刚开始使用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
}

Fyi db.Get()得到一个gorm数据库。

mhd8tkvw

mhd8tkvw4#

哦,我明白了,因为我也是新来的,如果你从框架中迁移过来,比如laravel或django,...你会觉得你可以在另一个应用程序中设计方案,比如https://dbdiagram.io/home和导出sql

twh00eeo

twh00eeo5#

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

相关问题