gpt4 book ai didi

go - 如何在 xorm 中维护迁移和模式?

转载 作者:IT王子 更新时间:2023-10-29 01:15:01 30 4
gpt4 key购买 nike

如何在xorm中维护迁移和schema?

type Version struct {
ID int64
Name string
}

engine.Sync(new(Version))

这只会将 xorm 模型与数据库同步。但在某些情况下我需要数据迁移。有没有像 rails schema.rb 和 migrations 这样的选项?

最佳答案

我知道自从提出问题以来已经有一段时间了,但我最近不得不研究有关该问题的稀缺信息,因此我决定详细说明@Alex Yu 的评论并发布我的发现。

确实为了执行迁移,我们需要 xorm/migrate 包。

考虑添加 2 个表的初始迁移。

var migrations = []*migrate.Migration{
{
ID: "201608301400",
Migrate: func(tx *xorm.Engine) error {
return tx.Sync2(&Person{})
},
Rollback: func(tx *xorm.Engine) error {
return tx.DropTables(&Person{})
},
},
{
ID: "201608301430",
Migrate: func(tx *xorm.Engine) error {
return tx.Sync2(&Pet{})
},
Rollback: func(tx *xorm.Engine) error {
return tx.DropTables(&Person{})
},
},
}

我们可以这样消费

m := migrate.New(engine, &migrate.Options{
TableName: "migrations",
IDColumnName: "id",
}, migrations)

err = m.Migrate()

现在让我们想象一下当我们向表 Person 添加一个字段时的场景。与我们明确告诉引擎添加列时人们可能发现的默认方法相反,这里我们只是再次同步我们的数据库。

此外,根据我的研究,我还没有找到在回滚时显式删除列的方法,因此我建议使用原始 SQL。

现在迁移将如下所示。请注意,您的 SQL 可能会有所不同。

var migrations = []*migrate.Migration{
{
ID: "201608301400",
Migrate: func(tx *xorm.Engine) error {
return tx.Sync2(&Person{})
},
Rollback: func(tx *xorm.Engine) error {
return tx.DropTables(&Person{})
},
},
{
ID: "201608301430",
Migrate: func(tx *xorm.Engine) error {
return tx.Sync2(&Pet{})
},
Rollback: func(tx *xorm.Engine) error {
return tx.DropTables(&Person{})
},
},
{
ID: "201608301460",
Migrate: func(tx *xorm.Engine) error {
return tx.Sync2(&Person{})
},
Rollback: func(tx *xorm.Engine) error {
_, e := tx.QueryString("ALTER TABLE dbo.person DROP COLUMN IF EXISTS your_new_column")
return e
},
},
}

Xorm 跟踪已执行的迁移,因此只会运行最后一个迁移。

关于go - 如何在 xorm 中维护迁移和模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43165507/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com