Grails中数据库迁移的良好工作流程是什么?

时间:2012-12-21 10:39:09

标签: grails database-migration grails-domain-class

我想使用database-migration grails插件进行数据库迁移。当我第一次启动Grails应用程序时,会自动创建所有数据库表。我的DataSource.groovy中的生产设置是:

production {


    dataSource {
        dbCreate = "update"
        url = "jdbc:mysql://localhost/myapp?useUnicode=yes&characterEncoding=UTF-8"
        username = "test"
        password = "test"
        dialect = org.hibernate.dialect.MySQL5InnoDBDialect
        properties {
           validationQuery = "select 1"
           testWhileIdle = true
           timeBetweenEvictionRunsMillis = 60000
        }
    }
}

在我的config.groovy中,我设置了:

grails.plugin.databasemigration.updateOnStart = true
grails.plugin.databasemigration.updateOnStartFileNames = ['changelog.groovy']

当我向域类添加属性时,我需要调整changelog文件。 在这种情况下,进行数据库迁移的最佳方法是什么?添加或删除列时我必须执行哪些步骤?

4 个答案:

答案 0 :(得分:10)

正如您可能知道的那样,dbcreate指令是not recommended用于生产用途:

  

您还可以完全删除dbCreate设置,一旦您的架构相对稳定,并且当您的应用程序和数据库部署在生产环境中时,建议您这样做。

因此请记住,您需要将其删除(或设置为'none')。


初始基线工作流程

  1. 定义当前状态
  2. 从更改日志创建数据库或标记为最新
  3. 设置配置选项
  4. 第一步是让changelog反映当前状态。如果您有现有数据库,则需要使用它来定义基线。否则,使用GORM定义表。

    这些命令将为您的数据库生成基准。我也选择使用groovy DSL格式而不是liquibase XML,因为readability

    现有数据库

    如果你已经拥有一个包含数据的生产数据库,那就有点棘手了。您需要从grails环境访问数据库或其副本。如果您操作副本,则需要将更新应用到生产中(并可能将其作为计划中断进行管理)。

    命令是:

    grails [environment] dbm-generate-changelog changelog.groovy
    

    ...其中environment可选地指定数据库定义为的dev / test / prod / custom环境。

    然后,将数据库标记为关于更改日志的“最新”:

    grails [environment] dbm-changelog-sync
    

    然后,如果需要,请将数据库重新应用到生产中。

    新数据库

    如果您没有现有数据库(或不关心):

    grails dbm-generate-gorm-changelog changelog.groovy
    

    然后,从更改日志创建数据库:

    grails [environment] dbm-update
    

    的配置

    您已经正确设置了选项:

    grails.plugin.databasemigration.updateOnStart = true
    grails.plugin.databasemigration.updateOnStartFileNames = ['changelog.groovy']
    

    这些选项只是意味着插件将在应用程序启动时尝试将更改应用于数据库。


    开发工作流程

    1. 对域名进行更改
    2. 生成识别差异的更改日志
    3. (备份和)更新数据库
    4. 现在您已经拥有了一个最新的数据库,并且您正在粉碎对域类的更改,添加新的更改以及更改验证属性。

      每次要记录更改时,都希望将GORM类与数据库中存在的类进行比较,并创建新的更改日志文件以记录差异:

      grails [environment] dbm-gorm-diff [meaningful name].groovy --add
      

      此处environment是您要比较的数据库,meaningful name应以某种方式反映所应用的更改(可能是JIRA问题密钥,版本号或说明)。 / p>

      --add标记会在include中插入changelog.groovy语句。

      如果您已配置updateOnStart,那么您就完成了!否则,要手动处理更新,请重复使用以下命令:

      grails [environment] dbm-update
      

      RTFM

      • 插件文档 - Getting Started
      • 插件文档 - General Usage
      • Confile上面的回答指向一个好的tutorial,详细介绍了有关更改日志的手动更改
      • Liquibase文档 - Changesets(使用XML格式,但对理解概念很有用)

答案 1 :(得分:1)

我将使用的方法是将每个表格迁移到Grails域,并正确设置映射(非常重要!)

然后让Grails第一次创建数据库,然后使用您要迁移的数据库的先前备份填充它。

在此之后,每次启动时,Grails都会将数据库配置为更新数据库。

我知道这看起来有点乱,但如果我这样做,我就会这样做。

希望有所帮助:)

答案 2 :(得分:1)

我找到了一个非常好的教程,它解释了我的问题的解决方案:

Grails Db Migration Tutorial

答案 3 :(得分:0)

工作流程包含以下步骤:

1)使用命令grails install-plugin database-migration

安装插件

2)设置插件后,运行命令:

grails dbm-generate-gorm-changelog changelog.groovy or changelog.xml

默认情况下,它会在位置上生成一个文件grails-app / migrations / changelog.groovy或.xml

3)设置dataSource dbcreate='none'

3)现在,运行

grails dbm-changelog-sync

这将创建一个表名databasechangelog,并将根据您现有的架构插入条目。

多数民众赞成。