Grails 数据库迁移插件默默地无法添加非空约束

Wee*_*zle 3 grails database-migration grails-plugin

我正在尝试使用此站点作为参考来熟悉Grails 数据库迁移插件。我在尝试添加具有非空约束的属性时遇到问题。我按照网站上显示的方式对我的脚本进行建模(添加列,为现有记录设置默认值,然后向列添加不可为空的约束):

databaseChangeLog = {
    changeSet(author: "Ryan (generated)", id: "1340893788251-1") {
        addColumn(tableName: "game") {
            column(name: "genre", type: "varchar(255)")
        }

        grailsChange{
            change{
                sql.executeUpdate("UPDATE game SET genre = 'Other'")
            }
        }

        addNotNullConstraint(tableName: "game", columnName: "genre")
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试更新我的数据库时,它默默地失败了。因此,我将三个更改拆分为三个不同的 groovy 脚本来追踪问题。

第一个文件(添加列)工作正常:

databaseChangeLog = {
    changeSet(author: "Ryan (generated)", id: "1340893788251-1") {
        addColumn(tableName: "game") {
            column(name: "genre", type: "varchar(255)")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个文件(为现有记录分配默认值)工作正常:

databaseChangeLog = {
    changeSet(author: "Ryan (generated)", id: "defaultValue") {
        grailsChange{
            change{
                sql.executeUpdate("UPDATE game SET genre = 'Other'")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第三个文件(添加非空约束)静默失败:

databaseChangeLog = {
    changeSet(author: "Ryan (generated)", id: "notNull") {
        addNotNullConstraint(tableName: "game", columnName: "genre")
    }
}
Run Code Online (Sandbox Code Playgroud)

日志文件仅显示与插件相关的这一点:

2012-06-28 10:17:11,694 [main] INFO liquibase - 成功获取更改日志锁
2012-06-28 10:17:11,972 [main] INFO liquibase - 阅读自DATABASECHANGELOG
2012-06-28 10:17:11, main] INFO liquibase - 从DATABASECHANGELOG
2012-06-28 10:17:12,009 开始阅读 [main] INFO liquibase - 成功释放变更日志锁

如果我检查 databasechangelog 表,我可以看到脚本尚未执行。控制台给了我这个:

| 为数据库 root @ jdbc:mysql://localhost/migration 启动 dbm-update

但没有

| 完成 dbm-update

就像我看到的成功更新一样。

注意:需要注意的是,我用作参考的站点使用的是 1.0 版,我使用的是 1.1 版。我很难找到这个插件的教程或示例,更难找到最新版本(一个月前发布)的信息。

任何人都可以查明非空约束哪里出错了?

Wee*_*zle 5

午餐时我正在思考这个问题,并想知道为什么我没有采取明显的调试步骤。groovy 脚本更改是从头开始的。添加列的更新有效,这意味着我的数据库和域对象之间的唯一区别是不可为空的约束:

class Game {
    String genre

    static constraints = {
        genre(nullable:  false, blank:  false)
    }
}
Run Code Online (Sandbox Code Playgroud)

...那么为什么不运行grails dbm-gorm-diff并查看插件提供了什么?

结果是这样的:

databaseChangeLog = {
    changeSet(author: "Ryan (generated)", id: "1340897310305-1") {
        addNotNullConstraint(columnDataType: "varchar(255)", columnName: "genre", tableName: "game")
    }
}
Run Code Online (Sandbox Code Playgroud)

我创建的更改脚本和插件制作的脚本之间的唯一区别是:
columnDataType: "varchar(255)"

我将它添加到我制作的脚本中(只是为了确保我没有做错任何其他事情)并且宾果游戏,更新有效。