Sam*_*amo 2 migration grails seeding grails-2.0
目标 - 在单个部署/重启中,我想创建一个新表并填充一些记录,因为会有代码更改,期望这些数据存在.
理想 - 编写实现此目的的迁移.想象一下,我已经创建了我的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()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我将把它添加到changelog.groovy
include file: 'populate-foo-table.groovy'
Run Code Online (Sandbox Code Playgroud)
grails dbm-update再次运行后,我的foo表中没有记录.这不是验证问题,因为我可以Foo从应用程序代码中创建对象.我甚至不确定如何判断我的迁移是否已执行,因为断点似乎没有在迁移中捕获.
所以我想有两个好问题要问:
我意识到我可以先创建表和域类,部署它,创建导入工具或管理界面来播种数据,然后修改代码以使用数据.我真的不想完成所有这些.我应该能够通过单一部署无缝地完成此任务,就像我在Rails中一样.
谢谢!
下面是我实际迁移的一个例子,而不是运行和工作:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,以下是您的问题的答案:
根据文档,您可以执行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')")
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以查看DATABASECHANGELOG表以确定是否已执行特定的更改集.甚至还有一个控制器可以通过HTML查看.
| 归档时间: |
|
| 查看次数: |
1810 次 |
| 最近记录: |