目标 - 在单个部署/重启中,我想创建一个新表并填充一些记录,因为会有代码更改,期望这些数据存在。
理想 - 编写实现此目的的迁移。想象一下,我已经创建了我的Foo
类,生成了一个使用foo
创建grails dbm-gorm-diff ....
表的迁移,并使用grails dbm-update
运行迁移。我现在有我的域类和我的数据库表。凉。
现在我将编写一个填充表的新迁移。
databaseChangeLog = {
changeSet(author: "samslotsky", id: "PopulateFooTable") {
grailsChange {
change {
new Foo(bar: 'baz').save()
new Foo(bar: 'blitz').save()
}
}
}
}
我将把它添加到changelog.groovy
include file: 'populate-foo-table.groovy'
再次运行grails dbm-update
后,我的foo
表中没有记录。这不是验证问题,因为我可以从应用程序代码中创建Foo
个对象。我甚至不确定如何判断我的迁移是否已执行,因为断点似乎没有在迁移中捕获。
所以我想有两个好问题要问:
我意识到我可以先创建表和域类,部署它,创建导入工具或管理界面来播种数据,然后修改代码以使用数据。我真的不想经历所有这些。我应该能够通过单一部署无缝地完成此任务,就像我在Rails中一样。
谢谢!
答案 0 :(得分:8)
这是我实际迁移的一个例子,而不是跑步和工作:
changeSet(author: 'me', id: 'createCodeTrees') {
grailsChange {
change {
new CodeTree(name: 'BAN8', enabled: true, defaultTree: true).save(failOnError: true)
new CodeTree(name: 'BAN8OLD', enabled: true, defaultTree: false).save(failOnError: true)
new CodeTree(name: 'BANPPRD', enabled: true, defaultTree: false).save(failOnError: true)
new CodeTree(name: 'BANADVM', enabled: true, defaultTree: false).save(failOnError: true)
new CodeTree(name: 'BANSTFA', enabled: true, defaultTree: false).save(failOnError: true)
new CodeTree(name: 'BANHRPY', enabled: true, defaultTree: false).save(flush: true, failOnError: true)
}
}
答案 1 :(得分:6)
据我所知,以下是您问题的答案:
根据documentation,您可以执行Groovy代码,并注入一个groovy.sql.SQL实例来执行SQL语句。您可能希望执行以下操作:
databaseChangeLog = {
changeSet(author: "samslotsky", id: "PopulateFooTable") {
grailsChange {
change {
sql.execute("insert into foo (bar) values ('baz')")
sql.execute("insert into foo (bar) values ('blitz')")
}
}
}
}
您可以查看DATABASECHANGELOG表以确定是否已执行特定的更改集。甚至还有一个controller可以通过HTML查看。