首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在xorm中维护迁移和模式?

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

Stack Overflow用户
提问于 2017-04-02 14:58:47
回答 1查看 1K关注 0票数 3

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

代码语言:javascript
复制
type Version struct {
    ID      int64
    Name string
}

engine.Sync(new(Version))

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

EN

回答 1

Stack Overflow用户

发布于 2019-06-10 20:42:35

我知道这个问题已经有一段时间了,但我最近不得不研究关于这个问题的稀缺信息,所以我决定详细说明@Alex Yu的评论并发布我的发现。

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

考虑初始迁移,它添加了2个表。

代码语言:javascript
复制
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{})
        },
    },
}

我们可以按如下方式使用它

代码语言:javascript
复制
m := migrate.New(engine, &migrate.Options{
    TableName:    "migrations",
    IDColumnName: "id",
}, migrations)

err = m.Migrate()

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

而且,根据我的研究,我还没有找到在回滚时显式删除column的方法,所以我建议使用原始SQL。

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

代码语言:javascript
复制
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会跟踪已经执行的迁移,所以只会运行最后一个。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43165507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档