3

我正在努力遵循教程。以下是我采取的步骤:

1.)我首先创建我的空变更日志。在运行此命令之前,我将开发设置dbCreatecreate.

grails dbm-create-changelog

2.)然后我生成初始的 gorm 变更日志。教程说我应该使用prod标志,但由于我的生产数据库是空的,所以我放弃了prod标志。在我运行这个命令之前,我注释掉我的开发dbCreate设置。

grails dbm-generate-gorm-changelog --add changelog-1.0.groovy

此时我migrations的文件夹包含文件changelog.groovychangelog-1.0.groovy. 我将changelog-1.0.groovy称为changelog #1

3.)我现在尝试使用刚刚创建的变更日志来初始化我的生产数据库。我按照链接到的教程中的说明设置了数据库迁移updateOnStartupdateOnStartFileNames在我的配置中。我的生产数据库存在,但为空(没有表)。我的生产环境的dbCreate设置已被注释掉。

grails prod run-app

问题:

乍一看,这似乎有效,但是当我运行grails prod dbm-gorm-diff并生成时,changelog #2我看到了不应该存在的更改。与生产数据库的当前状态相比,我还可以看到变更集是合法的。这意味着生产数据库未使用changelog #1. 因为我什么都没改变,所以不应该存在任何变化。我跑完grails prod dbm-gorm-diff就跑了grails prod run-app

中有五个变更集changelog #2。我已经验证所有这些变更集都在changelog #1. 前四个变更集changelog #2都有unique: "true"。这四个变更集也是唯一包含unique: "true"changelog #1. 我仍然无法解释为什么存在第五个变更集。尽管它是针对Spring Security 插件user_role使用的表,但我可以看到它并没有什么特别之处。这里是:changelog #2

databaseChangeLog = {

    changeSet(author: "typoknig (generated)", id: "1341970550063-1") {
        createIndex(indexName: "authority_unique_1341970549765", tableName: "role", unique: "true") { // This table is for the Spring Security plugin's "Role" domain class.
            column(name: "authority")
        }
    }

    changeSet(author: "typoknig (generated)", id: "1341970550063-2") {
        createIndex(indexName: "name_unique_1341970549772", tableName: "foo", unique: "true") { // This is just a table for one of my domain classes that happens to have a field with a unique constraint.
            column(name: "path")
        }
    }

    changeSet(author: "typoknig (generated)", id: "1341970550063-3") {
        createIndex(indexName: "name_unique_1341970549774", tableName: "bar", unique: "true") { // This is just a table for one of my domain classes that happens to have a field with a unique constraint.
            column(name: "name")
        }
    }

    changeSet(author: "typoknig (generated)", id: "1341970550063-4") {
        createIndex(indexName: "username_unique_1341970549777", tableName: "user", unique: "true") { // This table is for the Spring Security plugin's "User" domain class.
            column(name: "username")
        }
    }

    changeSet(author: "typoknig (generated)", id: "1341970550063-5") {
        createIndex(indexName: "FK143BF46A5FBC0B79", tableName: "user_role") { // This table is for the Spring Security plugin's "UserRole" domain class.
            column(name: "role_id")
        }
    }
}

我需要做些什么来确保我的生产数据库已正确初始化?

更新#1:

我不知道为什么,但createIndex不使用unique: "true". 对于前四个变更集,我只是移动unique: "true"到最初在changeset #1. 这只剩下第五个变更集changelog #2需要处理。我仍然没有看到变更集有任何问题,所以我不明白为什么它没有被应用。

更新#2:

我发现我可以将所有对createIndex单个变更集的调用移出到创建表(索引所属)的相应变更集中。 这似乎解决了我所有的问题。 除非有人能提供一个令人信服的理由不这样做,否则我想我会将这部分作为我的变更日志生成工作流程的一部分。例如这些变更集:

changeSet(author: "typoknig (generated)", id: "1342037835503-31") {
    createTable(tableName: "user_role") {
        column(name: "role_id", type: "bigint") {
            constraints(nullable: "false")
        }

        column(name: "user_id", type: "bigint") {
            constraints(nullable: "false")
        }
    }
}

changeSet(author: "typoknig (generated)", id: "1342037835503-103") {
    createIndex(indexName: "FK143BF46A4E6CF59", tableName: "user_role") {
        column(name: "user_id")
    }
}

changeSet(author: "typoknig (generated)", id: "1342037835503-104") {
    createIndex(indexName: "FK143BF46A5FBC0B79", tableName: "user_role") {
        column(name: "role_id")
    }
}

将出现这个变更集:

changeSet(author: "typoknig (generated)", id: "1342037835503-31") {
    createTable(tableName: "user_role") {
        column(name: "role_id", type: "bigint") {
            constraints(nullable: "false")
        }

        column(name: "user_id", type: "bigint") {
            constraints(nullable: "false")
        }
    }
    createIndex(indexName: "FK143BF46A5FBC0B79", tableName: "user_role") {
        column(name: "role_id")
    }
    createIndex(indexName: "FK143BF46A4E6CF59", tableName: "user_role") {
        column(name: "user_id")
    }
}
4

1 回答 1

0

变更集可以依赖于目标数据库。例如,grails.org 站点曾经在 MySQL 中使用 MyISAM 表,并且dbm-gorm-diff总是会添加一些createIndex变更集,即使它们是在以前的变更集中定义的。

我真的不明白将createIndex声明移动到createTable变更集中会有什么不同。您能否说明这样做如何解决了您的所有问题?

于 2012-09-10T15:04:28.483 回答