如何在xorm中维护迁移和架构?
type Version struct {
ID int64
Name string
}
engine.Sync(new(Version))
这只会将xorm模型与数据库同步。 但在某些情况下我需要数据迁移。有没有像rails schema.rb和migrations这样的选项?
答案 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跟踪已经执行的迁移,因此仅运行最后一个。