从迁移更新字段

时间:2012-12-11 23:41:03

标签: grails gorm database-migration

我正在使用迁移插件添加字段:

databaseChangeLog = {
    changeSet(author: "me", id: "add publish_date") {
        addColumn(tableName: "book") {
            column(name: "publish_date", type: "timestamp") {
                constraints(nullable: "true")
            }
        }
    }
}

我还想更新一些publish_date的{​​{1}}。一种方法是使用Book,但这似乎不是数据库不可知的...我希望它是。

我认为在迁移中使用sql.execute("UPDATE book SET publish_date = ____ WHERE year = 2012")域会确保迁移适用于不同的数据库。如果这是理智/可能,任何人都可以评论吗?

Book

如果您希望保持迁移数据库不可知,有哪些选项?

1 个答案:

答案 0 :(得分:1)

使用Liquibase +插件的方法是

update(tableName: 'book') {
   column name: 'publish_date', value: '____'
   where 'year = 2012'
}

这与原始SQL方法有类似的问题,因为对于不同的数据库可能会有所不同,但Liquibase没有像Hibernate的HQL那样的东西。您可以将更改集限制为仅适用于特定数据库,因此您可以为您使用的每个数据库创建一个(例如,prod中的其他类型而不是dev),并且只运行正确的数据库。

GORM的问题是脚本是Groovy类,不会使用不同版本的代码进行编译,因此如果有人落后或者如果新开发人员通过运行所有迁移来构建数据库,那么它们将会失败有编译错误。

所以你需要选择哪种方法最不好。