1

使用 Grails 数据库迁移,我在生产中定义了一个表,如下所示:

+--------------+------------+------+-----+---------+----------------+
| 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

遇到了 database diffs 的问题之一,尽管与该帖子中给出的示例略有不同。迁移插件文档说的时候绝对不是在开玩笑:

在非开发数据库上运行迁移脚本时,重要的是在运行迁移之前备份数据库,以防出现任何问题。您还可以制作数据库的副本并针对它运行脚本,如果出现问题,真实数据库将不受影响。

有好几次我需要手动调整使用dbm-gorm-diff. 不幸的是,我认为它只是与领土有关。不过,这并不是要从插件中拿走任何东西。它并不完美,但自从我开始使用它以来,我对我的数据库结构更有信心。

于 2012-06-26T01:58:07.533 回答