1

在我看来,数据库更改的一个常见要求是添加一个不能为空的列。解决在某些情况下填充此列的问题的一种方法是在 DDL 中将其定义为“not null with default”。

Grails 似乎不直接在约束中支持“NNWD”。我测试了一个似乎可以等效的想法:

    String name = default
    ...
    name nullable:false

我想知道dbm-gorm-diff changleog-n.xml是否能够将其检测为具有默认值的空值。但它没有。那是版本 1.2.2。我看到 Liquibase 通过它的<addNotNullConstraint.

是否有计划引入这种支持?关于我如何解决这个问题的任何建议,可能是通过使用 dbm 脚本的用户编写的脚本。

问题:

我尝试使用 1.3.2,但在运行脚本时出现 MissingMethodException。实际的错误行是:

groovy.lang.MissingMethodException:没有方法签名:静态 grails.plugin.databasemigration.ScriptUtils.executeAndWrite() 适用于参数类型:(java.lang.String, java.lang.Boolean, DbmGormDiff$_run_closure1_closure2) 值:[changelog -with-data.xml,假,DbmGormDiff$_run_closure1_closure2@2f673724]

我不明白,因为 args 似乎与插件代码中的 executeAndWrite() 方法的签名相匹配。

问候,约翰

4

2 回答 2

1

我已经对这个主题进行了一些调查,并意识到解决方案更复杂,并且尝试通过使用“not null with default”添加列来解决问题并不是要走的路。由于我计划使用 Liquibase 和 Ant 来更新测试、uat 和实时环境中的数据库,所以我在下面提到使用 xml 文件。

如果表没有任何数据,那么您可以添加一个“非空”列。在我看来,这对于实时数据库来说是不太可能的情况。

当表包含数据时,必须将新列定义为空。有 3 个步骤,需要手动更新插件生成的 xml 文件:

  • 将新域属性定义为“nullable:true”,并生成 diff xml 文件。
  • 使用 <SQL> 标记更新 xml 文件以添加新的变更集:

    <sql>update [table] set [column]='dflt value' where [column] 为空</sql>

  • 现在您可以将新列定义为非空。可以使用更多原始 sql,或者查找 Liquibase 的 <addNotNullConstraint>。

我不认为该列确实需要默认值,因为 Grails 将确保空值不会从浏览器中通过。我这么说是因为我还没有找到改变添加列的定义的方法,因此它具有默认值。

约翰

于 2013-01-17T09:58:50.857 回答
0

如果您使用的是 1.4.0 版本的插件,它不会为默认值生成更改日志 xml,但您可以编辑生成的文件以添加defaultValue&value属性,它将通过更新现有的添加非空列而不会出错带有value属性的记录。

这是一个小例子,说明修改后的样子:

    <changeSet author="anybody (generated)" id="1467324956xxx-xx">
    <addColumn tableName="table1">
    <column name="col1" type="varchar(10)" defaultValue="value1" value="value1">
    <constraints nullable="false"/>
    </column>
    </addColumn>
    </changeSet>

您可以在 liquibase 文档http://www.liquibase.org/documentation/column.html http://www.liquibase.org/documentation/changes/add_column.html上找到更多信息

于 2016-07-01T02:20:03.980 回答