我们如何在Grails中迁移/更新数据库模式?

我们已经与Grails合作了一段时间,我的团队负责人提出了一些关于Grails ORM(GORM)的问题:

  1. 一旦我们转向生产,我们如何维护数据库架构?
  2. 我们可以用Grails更新数据库架构吗?
  3. 如果架构已更新,是否会自动反映更改/框架是否会处理此问题?
  4. 是否有任何Grails插件可以让我们更新架构而不会头疼?

我最近发布了用于数据库迁移的官方Grails插件 – 请参阅http://grails.org/plugin/database-migration和http://grails-plugins.github.com/grails-database-migration/docs/manual上的文档/index.html

我正在与Liquibase的作者合作,因此旧的liquibase插件现已弃用,因为它使用最新版本的Liquibase(2.0)并且得到SpringSource的正式支持,所以应该使用新的liquibase插件。 有关他的公告,请参见http://blog.liquibase.org/2011/01/new-standard-liquibase-plugin-grails-database-migration.html 。

在Grails用户邮件列表(从http://grails.org/Mailing+lists注册)或http://grails-plugins.847840.n3.nabble.com/上的新插件论坛上询问使用问题,或发送电子邮件给作者直接:)

  1. 删除DataSource.groovy用于生产环境的dbCreate参数 – 这将阻止GORM自动更新数据库架构。

  2. 当然。 使用LiquiBase插件 。

  3. GORM可以使用dbCreate='update' ,但强烈建议不要这样做。 例如,如果重命名字段,GORM / LiquiBase永远不会确定您必须迁移数据,而不仅仅是drop + create。

  4. 在一行中: grails db-diff生成LiquiBase的changelog.xmlgrails migrate -Dgrails.env=以将其应用于各自的db服务器。

虽然“自动创建”function可以让项目启动并运行,但我发现liquibase是使数据库保持最新的最佳方法。 有一个grails插件 ,我相信DSL上的工作正在进行中。

因此,创建一个基线模式(您可以使用liquibase的generate-changelog)然后通过liquibase进行所有未来的更改,它将为您管理更新,回滚甚至一些数据库互操作。 您可以将DataSource.groovy配置设置为validation,如果架构与域配置不匹配,grails将无法启动:

 environments { development { dataSource { dbCreate = "validate" 

您可能还对liquibase-runner插件感兴趣,以便在应用程序启动时运行迁移。