5

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

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

4

4 回答 4

10

正如您可能知道的那样,不建议dbcreate将该指令用于生产用途:

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

所以请记住,您将需要删除它(或设置为'none')。


初始基线工作流程

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

第一步是让changelog反映当前状态。如果你有一个现有的数据库,你想用它来定义基线。否则,使用 GORM 定义表。

这些命令将为您的数据库生成基线。另外我选择使用 groovy DSL 格式而不是 liquibase XML,因为可读性.

现有数据库

如果您已经有一个包含数据的生产数据库,那有点棘手。您将需要从您的 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. (备份和)更新数据库

所以现在你已经有了一个最新的数据库,你正在粉碎对域类的更改,添加新的和更改验证属性。

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

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

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

--add标志将includechangelog.groovy.

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

grails [environment] dbm-update

实时调频

  • 插件文档 -入门
  • 插件文档 -一般用法
  • 上面的配置文件的答案指向一个很好的教程,该教程详细介绍了手动更改更改日志
  • Liquibase 文档 -变更集(使用 XML 格式,但有助于理解概念)
于 2014-12-03T01:21:13.673 回答
1

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

Grails Db 迁移教程

于 2012-12-21T18:55:05.703 回答
1

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

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

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

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

希望能帮助到你 :)

于 2012-12-21T15:15:23.663 回答
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 并将根据您现有的模式插入条目。

而已。

于 2013-10-09T17:08:40.083 回答