2

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

理想 - 编写完成此任务的迁移。想象一下,我创建了我的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()
            }
        }
    }
}

我会将它添加到 changelog.groovy

include file: 'populate-foo-table.groovy'

再次运行后,我的表grails dbm-update中没有记录。foo这不是验证问题,因为我可以Foo从应用程序代码中很好地创建对象。我什至不确定如何判断我的迁移是否已执行,因为断点似乎没有在迁移中捕获。

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

  1. 除了寻找副作用(即我的数据库表被填充)之外,我如何确定我的迁移甚至已经执行?
  2. 如何从迁移中创建新记录?我可以使用 Groovy 代码,还是我一直在编写 SQL?

我意识到我可以先创建表和域类,部署它,创建导入工具或管理界面来播种数据,然后修改代码以使用数据。我真的不想经历这一切。我应该能够像在 Rails 中那样,通过一次部署无缝地做到这一点。

谢谢!

4

2 回答 2

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)
        }
    }
于 2013-05-25T03:00:15.140 回答
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')")
                }
            }
        }
    }

您可以查看 DATABASECHANGELOG 表以确定是否已执行特定变更集。甚至还有一个控制器可以通过 HTML 来查看它。

于 2013-05-24T19:06:41.433 回答