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').
第一步是让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)
这些选项只是意味着插件将在应用程序启动时尝试将更改应用于数据库.
因此,现在您已经拥有了一个最新的数据库,并且您正在粉碎域类的更改,添加新的更改和更改验证属性.
每次要记录更改时,都要将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)
我将使用的方法是将每个表迁移到 Grails 域,并正确设置映射(非常重要!)。
\n\n然后让 Grails 第一次创建数据库,然后用要迁移的数据库的先前备份填充它。
\n\n在此之后,设置 Grails 配置以在每次启动时更新数据库。
\n\n我知道这看起来有点乱,但如果我\xc2\xb4ve 这样做,我会\xc2\xb4ve 这样做。
\n\n希望能帮助到你 :)
\n