我决定使用gorm作为我的ORM。我想要使用golang-migrate/migrate进行迁移,因为 GORM 似乎没有版本化的迁移文件。而且我更喜欢使用 CLI 进行迁移,而不是使用自动迁移。
我阅读了 gorm 的文档,但没看到 gorm 如何将模型转换成 SQL 表格的说明。是否有任何关于gorm生成的SQL表格的示例或文档?(特别是类型或关联如何映射到SQL)
我决定使用gorm作为我的ORM。我想要使用golang-migrate/migrate进行迁移,因为 GORM 似乎没有版本化的迁移文件。而且我更喜欢使用 CLI 进行迁移,而不是使用自动迁移。
我阅读了 gorm 的文档,但没看到 gorm 如何将模型转换成 SQL 表格的说明。是否有任何关于gorm生成的SQL表格的示例或文档?(特别是类型或关联如何映射到SQL)
up
和down
函数中,您可以使用gorm内置的迁移函数 (https://gorm.io/docs/migration.html)。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数据库的方法。
Atlas支持 GORM的自动迁移规划。
使用Atlas,您可以从GORM模型自动生成版本化迁移。您可以生成Atlas格式的迁移以便在Atlas中应用,或者如果您想要使用golang-migrate,则Atlas也可以生成该格式的迁移。
祝好!
(完全透明:我是作者之一)
type Post struct {
ID uuid.UUID `gorm:"type:uuid;default:uuid_generate_v4()"`
Title string
Tags pq.StringArray `gorm:"type:text[]"`
}
另外,请查看自定义数据类型章节。
Gorm中没有直接的解决方案来自动生成SQL。在golang-migrate/migrate中,您需要为每个版本编写升级/降级迁移版本的up和down SQL脚本,并且不能使用gorm来生成这些文件。
您应该手动同步您的Gorm模型与迁移脚本。
有一种hacky的方法可以从Gorm自动迁移中获取SQL代码。您可以在Gorm创建阶段注入您的记录器(请参见文档),然后在所有模型更改后编译您的应用程序。不要忘记为记录器设置Info严重性。然后,自动迁移SQL应该在记录器输出中。然后您需要将其复制粘贴到迁移文件中。
哦,我明白了,因为我在使用Go语言方面也是新手。如果你从像Laravel或Django这样的框架迁移而来,你会感觉到一些不同。
你可以在另一个应用程序中设计方案,如https://dbdiagram.io/home,并导出SQL。