gpt4 book ai didi

Grails 数据库迁移变更日志问题

转载 作者:行者123 更新时间:2023-12-02 04:04:34 25 4
gpt4 key购买 nike

我在努力追this教程。以下是我采取的步骤:

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

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 run-app 之后立即运行了 grails prod dbm-gorm-diff

changelog #2 中有五个变更集。我已验证所有这些变更集都在 changelog #1 中表示。 changelog #2 中的前四个变更集都有 unique: "true"。这四个变更集也是唯一在 changelog #1 中包含 unique: "true" 的变更集。我仍然无法解释为什么存在第五个变更集。尽管它是针对 Spring Security plugin 使用的 user_role 表,但我看不出有什么特别之处。 .这是变更日志#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")
}
}

最佳答案

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

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

关于Grails 数据库迁移变更日志问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11424782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com