我正在努力遵循本教程。以下是我采取的步骤:
1.)我首先创建我的空变更日志。在运行此命令之前,我将开发设置dbCreate
为create
.
grails dbm-create-changelog
2.)然后我生成初始的 gorm 变更日志。教程说我应该使用prod
标志,但由于我的生产数据库是空的,所以我放弃了prod
标志。在我运行这个命令之前,我注释掉我的开发dbCreate
设置。
grails dbm-generate-gorm-changelog --add changelog-1.0.groovy
此时我migrations
的文件夹包含文件changelog.groovy
和changelog-1.0.groovy
. 我将changelog-1.0.groovy
称为changelog #1
3.)我现在尝试使用刚刚创建的变更日志来初始化我的生产数据库。我按照链接到的教程中的说明设置了数据库迁移updateOnStart
并updateOnStartFileNames
在我的配置中。我的生产数据库存在,但为空(没有表)。我的生产环境的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")
}
}