【问题标题】:grails database-migration - can it generate for 'not null with default'?grails database-migration - 它可以生成'not null with default'吗?
【发布时间】:2012-12-30 04:46:43
【问题描述】:

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

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

    String name = default
    ...
    name nullable:false

我想知道 dbm-gorm-diff changleog-n.xml 是否能够将其检测为具有默认值的 null。但它没有。那是版本 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, false, DbmGormDiff$_run_closure1_closure2@2f673724]

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

问候,约翰

【问题讨论】:

  • 没有看到您的代码,我们如何帮助解决缺少方法异常?
  • @James 我运行了 dbm-gorm-diff changelog-n.xml 命令。在 1.2.2 中工作,但在被 1.3.2 替换时给出了 MMException。我承认这是主要问题之外的一个问题,而不是追求这个的地方。我添加了它以防其他人看到这个。实际的 dbm-* 命令似乎无关紧要,因为所有/大多数命令似乎都使用 ScriptUtils.executeAndWrite()。约翰

标签: grails database-migration


【解决方案1】:

我对此主题进行了一些调查,并意识到解决方案更复杂,并且尝试通过使用“not null with default”添加列来解决不是可行的方法。由于我打算使用 Liquibase 和 Ant 来更新测试、uat 和 live 环境中的数据库,所以我参考下面的使用 xml 文件。

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

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

  • 将新的域属性定义为'nullable:true',并生成diff xml文件。
  • 使用 标签更新 xml 文件以添加新的变更集:

    update [table] set [column]='dflt value' where [column] 为空

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

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

约翰

【讨论】:

  • 您可以手动将 defaultValue 添加到变更集(示例如下)。缺点是域类默认值和数据库默认值在迁移插件更改时不会自动同步。因此,这两个默认值(或缺少默认值)很容易彼此不同步,并在以后引起意外。 changeSet(author: "me (generated)", id: "14660482-1") { addColumn(tableName: "mytable") { column(name: "mycolumn", type: "text", defaultValue: "一些默认字符串。 ") { 约束(nullable: "false") } } }
  • 创建自定义迁移部分下的 3 步过程的完整示例:caseyscarborough.com/blog/2014/04/02/…
【解决方案2】:

如果您使用的是 1.4.0 版本的插件,它不会为默认值生成更改日志 xml,但您可以编辑生成的文件以添加 defaultValuevalue 属性,它将添加非-null 列,通过使用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

【讨论】:

    猜你喜欢
    • 2020-04-15
    • 1970-01-01
    • 2010-10-13
    • 2023-03-27
    • 2012-12-21
    • 2018-09-12
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    相关资源
    最近更新 更多