1

Grails database-migration を使用して、次のように定義された本番環境のテーブルがあります。

+--------------+------------+------+-----+---------+----------------+
| Field        | Type       | Null | Key | Default | Extra          |
+--------------+------------+------+-----+---------+----------------+
| id           | bigint(20) | NO   | PRI | NULL    | auto_increment |
| version      | bigint(20) | NO   |     | NULL    |                |
| basket_id    | bigint(20) | NO   | MUL | NULL    |                |
| gift_card_id | bigint(20) | NO   | MUL | NULL    |                |
+--------------+------------+------+-----+---------+----------------+

最新の開発ブランチでは、このドメインを変更して複合キーを使用し、ID とバージョンを削除しました。

class BasketGiftCard implements Serializable {

  Basket basket
  GiftCard giftCard

  static mapping = {
    id composite: ['basket', 'giftCard']
    version false
  }
}

dbm-gorm-diff を実行すると、次のようになります。

changeSet(author: "gdboling (generated)", id: "1340670757336-8") {
    addPrimaryKey(columnNames: "basket_id, gift_card_id", constraintName: "basket_gift_cPK", tableName: "basket_gift_card")
}

changeSet(author: "gdboling (generated)", id: "1340670757336-16") {
    dropPrimaryKey(tableName: "basket_gift_card")
}

changeSet(author: "gdboling (generated)", id: "1340670757336-188") {
    dropColumn(columnName: "id", tableName: "basket_gift_card")
}

changeSet(author: "gdboling (generated)", id: "1340670757336-189") {
  dropColumn(columnName: "version", tableName: "basket_gift_card")
}

これについて興味深い (そして間違っている) のは、順序です。最初に dropPrimaryKey を実行し、次に他のすべてを実行する必要があります。そのまま、dbm-update を実行すると失敗します。

4

1 に答える 1

1

その投稿で示されている例とは少し異なりますが、データベースの差分に関する問題の1 つに遭遇しました。移行プラグインのドキュメントには、次のように書かれていましたが、決して冗談ではありませんでした。

非開発データベースで移行スクリプトを実行する場合、問題が発生した場合に備えて、移行を実行する前にデータベースをバックアップすることが重要です。データベースのコピーを作成し、それに対してスクリプトを実行することもできます。問題が発生しても、実際のデータベースは影響を受けません。

で生成された変更ログを手動で調整する必要が何度かありましたdbm-gorm-diff。残念ながら、それは領土に付随していると思います。ただし、プラグインから何かを奪うわけではありません。完璧ではありませんが、使い始めてからデータベース構造に自信が持てるようになりました。

于 2012-06-26T01:58:07.533 に答える