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

Sam*_*amo 2 migration grails seeding grails-2.0

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

理想 - 编写实现此目的的迁移.想象一下,我已经创建了我的Foo类,生成了一个用于创建foograils 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从应用程序代码中创建对象.我甚至不确定如何判断我的迁移是否已执行,因为断点似乎没有在迁移中捕获.

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

  1. 除了寻找副作用(即我的db表被填充),我怎么能确定我的迁移甚至已经执行了?
  2. 如何从迁移中创建新记录?我可以使用Groovy代码,还是我坚持编写SQL?

我意识到我可以先创建表和域类,部署它,创建导入工具或管理界面来播种数据,然后修改代码以使用数据.我真的不想完成所有这些.我应该能够通过单一部署无缝地完成此任务,就像我在Rails中一样.

谢谢!

Jam*_*eeh 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)
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 在迁移中使用域类是不好的做法,因为如果域发生更改,代码可能会中断. (2认同)

Gre*_*egg 6

据我所知,以下是您的问题的答案:

根据文档,您可以执行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查看.