1

データベースの変更の一般的な要件のように思われるのは、null にできない列の追加です。状況によっては、この列にデータを入力する際の問題を回避する 1 つの方法は、DDL で「デフォルトでは null ではない」と定義することです。

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: メソッドのシグネチャがありません: static 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]

引数がプラグインのコードの executeAndWrite() メソッドのシグネチャと一致しているように見えるため、これはわかりません。

よろしく、ジョン

4

2 に答える 2

1

このトピックについていくつか調査を行ったところ、解決策がより複雑であることに気付きました。「デフォルトでは null ではない」を使用して列を追加して解決しようとするのは適切ではありません。Liquibase と Ant を使用して、テスト、uat、およびライブ環境でデータベースを更新することを計画しているため、以下の xml ファイルの使用を参照します。

テーブルにデータがない場合は、'not null' の列を追加できます。これは、ライブデータベースではありそうもない状況のように思えます。

テーブルにデータが含まれている場合、新しい列を null として定義する必要があります。プラグインによって生成された xml ファイルを手動で更新する必要がある 3 段階のプロセスがあります。

  • 新しいドメイン属性を「nullable:true」として定義し、diff xml ファイルを生成します。
  • < SQL> タグを使用して xml ファイルを更新し、新しい変更セットを追加します。

    < sql>update [table] set [column]='dflt value' where [column] is null< /sql>

  • これで、新しい列を非 null として定義できます。より生の SQL を使用するか、Liquibase の < addNotNullConstraint> を調べることができます。

Grails はブラウザーから null を取得しないようにするため、列のデフォルト値が実際に必要だとは思いません。追加された列の定義を変更してデフォルト値にする方法が見つからなかったので、これを言います。

ジョン

于 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 に答える