【问题标题】:dropPrimaryKey in wrong orderdropPrimaryKey 顺序错误
【发布时间】:2012-06-27 07:24:54
【问题描述】:

使用 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 时,它​​会失败。

【问题讨论】:

    标签: grails database-migration liquibase


    【解决方案1】:

    您遇到过the problems with database diffs 之一,尽管与该帖子中给出的示例略有不同。迁移插件文档说的绝对不是开玩笑:

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

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

    【讨论】:

    • 感谢您的链接。所以你是说我的问题的答案是 diff 是不完美的,它不是一个错误?我只是想确定这确实是与其他东西的差异限制。
    • 嗯...我认为您可能会争辩说生成损坏的变更日志是一个错误,但从插件方面来看,这是一个 liquibase 问题,而 liquibase 的“修复”可能不会使用 diff 生成更新日志。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2016-11-25
    • 2021-05-03
    相关资源
    最近更新 更多