您可以使用Groovy代码在Grails迁移中创建和修改数据吗?

时间:2013-05-24 15:31:17

标签: grails migration grails-2.0 seeding

目标 - 在单个部署/重启中,我想创建一个新表并填充一些记录,因为会有代码更改,期望这些数据存在。

理想 - 编写实现此目的的迁移。想象一下,我已经创建了我的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个对象。我甚至不确定如何判断我的迁移是否已执行,因为断点似乎没有在迁移中捕获。

所以我想有两个好问题要问:

  1. 除了寻找副作用(即我的db表正在填充)之外,我如何确定我的迁移工作已经执行?
  2. 如何从迁移中创建新记录?我可以使用Groovy代码,还是我写了SQL?
  3. 我意识到我可以先创建表和域类,部署它,创建导入工具或管理界面来播种数据,然后修改代码以使用数据。我真的不想经历所有这些。我应该能够通过单一部署无缝地完成此任务,就像我在Rails中一样。

    谢谢!

2 个答案:

答案 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查看。