如何在xorm中维护迁移和模式?
type Version struct {
ID int64
Name string
}
engine.Sync(new(Version))这将仅将xorm模型与数据库同步。但在某些情况下,我需要数据迁移。有没有像rails、schema.rb和迁移这样的选项?
发布于 2019-06-10 20:42:35
我知道这个问题已经有一段时间了,但我最近不得不研究关于这个问题的稀缺信息,所以我决定详细说明@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添加字段时的场景。与我们显式告诉engine添加列时可能会发现默认方法相反,这里我们只是再次同步我们的数据库。
而且,根据我的研究,我还没有找到在回滚时显式删除column的方法,所以我建议使用原始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会跟踪已经执行的迁移,所以只会运行最后一个。
https://stackoverflow.com/questions/43165507
复制相似问题