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

con*_*ile 5 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

grails.plugin.databasemigration.updateOnStart = true
grails.plugin.databasemigration.updateOnStartFileNames = ['changelog.groovy']
Run Code Online (Sandbox Code Playgroud)

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

bra*_*zoo 10

您可能已经知道,该dbcreate指令不建议用于生产:

您也可以dbCreate完全删除该设置,一旦您的架构相对稳定,并且当您的应用程序和数据库部署在生产中时,建议您使用该设置.

所以请记住,你需要删除它(或设置为'none').


初始基线工作流程

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

第一步是让changelog反映当前状态.如果您有现有数据库,则需要使用它来定义基线.否则,使用GORM定义表.

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

现有数据库

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

命令是:

grails [environment] dbm-generate-changelog changelog.groovy
Run Code Online (Sandbox Code Playgroud)

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

在此之后,将数据库标记为关于更改日志的"最新":

grails [environment] dbm-changelog-sync
Run Code Online (Sandbox Code Playgroud)

然后重新应用数据库到生产,如果需要的话.

新数据库

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

grails dbm-generate-gorm-changelog changelog.groovy
Run Code Online (Sandbox Code Playgroud)

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

grails [environment] dbm-update
Run Code Online (Sandbox Code Playgroud)

组态

您已经正确设置了选项:

grails.plugin.databasemigration.updateOnStart = true
grails.plugin.databasemigration.updateOnStartFileNames = ['changelog.groovy']
Run Code Online (Sandbox Code Playgroud)

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


开发工作流程

  1. 对域名进行更改
  2. 生成识别差异的更改日志
  3. (备份和)更新数据库

因此,现在您已经拥有了一个最新的数据库,并且您正在粉碎域类的更改,添加新的更改和更改验证属性.

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

grails [environment] dbm-gorm-diff [meaningful name].groovy --add
Run Code Online (Sandbox Code Playgroud)

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

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

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

grails [environment] dbm-update
Run Code Online (Sandbox Code Playgroud)

RTFM

  • 插件文档 - 入门
  • 插件文档 - 一般用法
  • Confile上面的回答指向了一个很好的教程,详细介绍了有关更改日志的手动更改
  • Liquibase文档 - 变更集(使用XML格式,但对理解概念很有用)


axi*_*tjz 1

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

\n\n

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

\n\n

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

\n\n

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

\n\n

希望能帮助到你 :)

\n