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 を実行すると失敗します。