如何在xorm中维护迁移和架构?

时间:2017-04-02 06:58:47

标签: go orm

如何在xorm中维护迁移和架构?

type Version struct {
    ID      int64
    Name string
}

engine.Sync(new(Version))

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

1 个答案:

答案 0 :(得分:0)

我知道问题提出已经有一段时间了,但是我最近不得不研究有关该问题的稀缺信息,所以我决定详细阐述@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跟踪已经执行的迁移,因此仅运行最后一个。