在 Grails 中进行数据库迁移的良好工作流程是啥?

Posted

技术标签:

【中文标题】在 Grails 中进行数据库迁移的良好工作流程是啥?【英文标题】:What is a good workflow for database migration in Grails?在 Grails 中进行数据库迁移的良好工作流程是什么? 【发布时间】:2012-12-08 22:30:29 【问题描述】:

我想使用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']

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

【问题讨论】:

【参考方案1】:

您可能知道,dbcreate 指令是 not recommended 用于生产用途:

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

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


初始基线工作流程

    定义当前状态 根据更改日志创建数据库或标记为最新 设置配置选项

第一步是获取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']

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


开发工作流程

    更改域 生成更改日志以识别差异 (备份和)更新数据库

所以现在您已经有了一个最新的数据库,并且您正在对域类进行更改,添加新的类并更改验证属性。

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

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

这里environment 是您要比较的数据库,meaningful name 应该以某种方式反映正在应用的更改(可能是 JIRA 问题密钥、版本号或描述)。

--add 标志将在changelog.groovy 中插入一个include 语句。

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

grails [environment] dbm-update

实时调频

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

【讨论】:

【参考方案2】:

工作流程由以下步骤组成:

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 并根据您现有的架构插入条目。

就是这样。

【讨论】:

【参考方案3】:

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

Grails Db Migration Tutorial

【讨论】:

请在此处提供教程摘要,以便在链接失效时仍可在此处找到解决方案。【参考方案4】:

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

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

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

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

希望对你有帮助:)

【讨论】:

以上是关于在 Grails 中进行数据库迁移的良好工作流程是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Grails 数据库迁移 - dbm-gorm-diff 不起作用

Grails 数据库迁移插件

Grails 2.3 迁移脚本不会在集成测试期间运行

Grails 数据库迁移插件静默无法添加非空约束

启动后如何运行 Grails 数据库迁移

在 grails 中迁移 mongodb 插件时发生异常