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

Posted

技术标签:

【中文标题】Grails 数据库迁移插件静默无法添加非空约束【英文标题】:Grails Database Migration plugin silently fails to add not null constraint 【发布时间】:2012-06-30 05:42:46 【问题描述】:

我正在尝试使用this site 作为参考来熟悉Grails Database Migration Plugin。尝试添加具有非空约束的属性时遇到问题。我以与网站上显示的相同方式对脚本进行建模(添加列,为现有记录设置默认值,然后向列添加不可为空的约束):

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")
    

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

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

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

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

databaseChangeLog = 
    changeSet(author: "Ryan (generated)", id: "defaultValue") 
        grailsChange
            change
                sql.executeUpdate("UPDATE game SET genre = 'Other'")
            
        
    

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

databaseChangeLog = 
    changeSet(author: "Ryan (generated)", id: "notNull") 
        addNotNullConstraint(tableName: "game", columnName: "genre")
    

日志文件仅显示与插件相关的内容:

2012-06-28 10:17:11,694 [main] INFO liquibase - 成功获取更改日志锁 2012-06-28 10:17:11,972 [主要] 信息 liquibase - 阅读自 DATABASECHANGELOG 2012-06-28 10:17:11,980 [main] INFO liquibase - 阅读自 DATABASECHANGELOG 2012-06-28 10:17:12,009 [main] INFO liquibase - 成功释放更改日志锁

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

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

但是没有

|完成 dbm-update

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

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

谁能指出我在使用非空约束时出了什么问题?

【问题讨论】:

看起来这是一个错误,因为显然没有应用约束。你知道正在运行的 SQL 是否真的失败了吗? 稍微扩展一下 cdexzaq 所说的内容,如果您直接针对您的 MySQL 数据库运行 alter table game modify genre varchar(255) not null;,您会遇到错误吗? @cdeszaq @proflux alter table game modify genre varchar(255) not null; 可能会奏效。我以不同的方式调试了这个问题(请参阅下面的答案)。 啊!对不起,我意识到我复制了错误的第三个文件。我更新了问题。问题和答案现在应该更有意义了。 @Weezle - MySQL 和 MS-SQL 需要它。 liquibase.org/manual/add_not-null_constraint 【参考方案1】:

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

class Game 
    String genre

    static constraints = 
        genre(nullable:  false, blank:  false)
    

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

结果是这样的:

databaseChangeLog = 
    changeSet(author: "Ryan (generated)", id: "1340897310305-1") 
        addNotNullConstraint(columnDataType: "varchar(255)", columnName: "genre", tableName: "game")
    

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

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

【讨论】:

以上是关于Grails 数据库迁移插件静默无法添加非空约束的主要内容,如果未能解决你的问题,请参考以下文章

Grails 3 数据库迁移插件初始化错误

MySQL 无法添加外键约束

Grails 数据库迁移插件

Grails 数据库迁移插件 updateOnStart 不起作用

Grails 数据库迁移插件问题

grails4中的数据库迁移插件错误