Grails 中数据库迁移的良好工作流程是什么?

2024-04-28

我想使用数据库迁移 http://grails.org/plugin/database-migration用于数据库迁移的 grails 插件。当我第一次启动 Grails 应用程序时,所有数据库表都会自动创建。我的 DataSource.groovy 中的生产设置是:

production {


    dataSource {
        dbCreate = "update"
        url = "jdbc:mysql://localhost/myapp?useUnicode=yes&characterEncoding=UTF-8"
        username = "test"
        password = "test"
        dialect = org.hibernate.dialect.MySQL5InnoDBDialect
        properties {
           validationQuery = "select 1"
           testWhileIdle = true
           timeBetweenEvictionRunsMillis = 60000
        }
    }
}

在我的 config.groovy 中我设置:

grails.plugin.databasemigration.updateOnStart = true
grails.plugin.databasemigration.updateOnStartFileNames = ['changelog.groovy']

当我向域类添加属性时,我需要调整更改日志文件。 在这种情况下进行数据库迁移的最佳方法是什么?添加或删除列时必须执行哪些步骤?


您可能知道,dbcreate指令是不建议 http://grails.org/doc/latest/guide/conf.html#dataSource生产用途:

您还可以删除dbCreate完全设置,一旦您的模式相对稳定,并且当您的应用程序和数据库部署在生产中时,建议您这样做。

因此请记住,您需要删除它(或设置为'none').


初始基线工作流程

  1. 定义当前状态
  2. 从更改日志创建数据库或标记为最新
  3. 设置配置选项

第一步是获取changelog以反映当前状态。如果您有一个现有数据库,您希望使用它来定义基线。否则,使用 GORM 定义表。

这些命令将为您的数据库生成基线。另外,我选择使用 groovy DSL 格式而不是 liquibase XML,因为可读性 http://www.w3.org/People/Bos/DesignGuide/readability.html.

现有数据库

如果您已经有了一个包含数据的生产数据库,那就有点棘手了。您将需要从 grails 环境访问数据库或其副本。如果您操作副本,您将需要将更新应用回您的生产(并可能将其作为计划中断进行管理)。

命令是:

grails [environment] dbm-generate-changelog changelog.groovy

...在哪里environment(可选)指定数据库定义的 dev/test/prod/custom 环境。

接下来,根据变更日志将数据库标记为“最新”:

grails [environment] dbm-changelog-sync

然后,如有必要,将数据库重新应用到生产中。

新数据库

如果您没有现有数据库(或不关心):

grails dbm-generate-gorm-changelog changelog.groovy

然后,从变更日志创建数据库:

grails [environment] dbm-update

配置

您已经正确设置了选项:

grails.plugin.databasemigration.updateOnStart = true
grails.plugin.databasemigration.updateOnStartFileNames = ['changelog.groovy']

这些选项只是意味着插件将在应用程序启动时尝试将更改应用到数据库。


开发流程

  1. 更改域
  2. 生成变更日志以识别差异
  3. (备份和)更新数据库

现在您已经拥有了最新的数据库,并且您正在消除对域类的更改,添加新的并更改验证属性。

每次您想要记录更改时,您都希望将 GORM 类与数据库中存在的类进行比较,并创建一个新的更改日志文件来记录差异:

grails [environment] dbm-gorm-diff [meaningful name].groovy --add

Here environment是您要比较的数据库,并且meaningful name应该以某种方式反映正在应用的更改(可能是 JIRA 问题密钥、版本号或描述)。

The --add标志将插入一个include中的声明changelog.groovy.

如果你已经配置了updateOnStart,那么你就完成了!否则,要手动处理更新,请重复使用命令:

grails [environment] dbm-update

RTFM

  • 插件文档 -入门 http://grails-plugins.github.io/grails-database-migration/docs/manual/guide/gettingStarted.html
  • 插件文档 -一般用法 http://grails-plugins.github.io/grails-database-migration/docs/manual/guide/generalUsage.html
  • 上面的 Confile 回答很好tutorial http://wpgreenway.com/posts/grails-db-migration-tutorial/详细介绍了更改日志的手动更改
  • Liquibase 文档 -变更集 http://www.liquibase.org/documentation/changeset.html(使用 XML 格式,但对于理解概念很有用)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Grails 中数据库迁移的良好工作流程是什么? 的相关文章

随机推荐

  • 同时验证 C# Windows 窗体上的多个文本框

    我有一个带有几个文本框和其他控件的表单 我正在使用 errorprovider 控件 并将验证事件连接到需要验证的每个文本框上 当一个控件将焦点转移给另一个控件时 将发生 Validating 事件 因此 当您使用 Tab 键离开当前控件或
  • 对象作为参数传递给另一个类,通过值还是引用?

    在C 中 我知道默认情况下 传递给函数的任何参数都是通过复制的 也就是说 在函数内 有一个参数的本地副本 但是 当一个对象作为参数传递给另一个类时该怎么办 像下面这样的场景是通过引用传递还是通过值传递 class MyClass priva
  • 递归 - 与 Java 中不重复的数组相结合

    所以我知道如何获取组合的大小 数组大小 在我的例子中 除以所需数组子集大小的阶乘 我遇到的问题是获取组合 到目前为止 我已经阅读了 stackoverflow 上的大部分问题 但一无所获 我认为我发现的问题是我想将创建的组合子集中的元素添加
  • Azure DevOps REST API - 选项列表如何与字段关联?

    I am trying to use rest to create fields and picklists on the web site I created a field as type picklist String and add
  • MySQL 存储映像 BLOB 不良实践性能

    我知道不建议在 SQL 中将图像存储为 BLOB 然而 在我的本地 PC 和服务器上同时工作使得在两者之间同步图像变得困难 是否还有理由不单独使用 BLOB 作为备份 这会在本地创建缓存文件 以静态方式提供服务 本质上 只有选择 BLOB
  • 当 br 位于允许的内容中时,ckeditor 会删除

    当我将 br 添加到 ckeditor 允许的内容并添加 br 标签正在被更改为 br 但是当我添加 br 它正在被删除 为什么当 br 属于允许的内容时它会被删除 有什么建议么 您的帖子中缺少一些内容 不知道为什么 也不知道您想说什么 如
  • 堆内存和Slab分配

    我很困惑heap and free list 我有几个问题 我对C中malloc的工作原理有自己的理解 如果我错了 请纠正我 堆内存是否被组织为数据的链表 空闲列表 块 堆内存和空闲列表有区别吗 我对存储分配的理解 有待改进 当我们调用ma
  • 如何获取资源文件中所有资源的名称

    在 Visual Basic 项目中 我添加了一个包含一堆图像的资源文件 resx 现在我想查询图像的名称 如果我在 Visual Studio IDE 的设计器视图中打开 resx 文件并选择一个图像 属性网格会显示一个名称属性 默认为
  • 如何使用共享数据库在 Heroku 上进行 GIS 查询?

    我有一张带有纬度和经度的地理编码位置表 我希望我的数据库查询返回它们的过滤列表 按距固定点的距离排序 我探索过以下几个选项 Postgresql 的 Earthdistance 贡献 http www postgresql org docs
  • 无法通过 phantomjs 网络服务器传送图像文件

    我正在尝试让 phantomjs 网络服务器为我工作 我想提供 2 个文件 html 文件和 png 图像文件 html 文件服务良好并在浏览器中正确呈现 但 png 文件不是 这是服务器的代码 var fs require fs func
  • 使用 CORS 进行 React 中的 Fetch 时出现问题

    我对 CORS 完全陌生 并且遇到以下问题 我正在使用 create react app 端口 3000 调用 spring boot 端口 8080 中创建的一些 REST 服务 我将 JWT 身份验证添加到我的 REST API 中 因
  • 如何根据本地目录中的requirements.txt 文件使用pip 安装软件包?

    问题是这样的 我有一个要求 txt文件看起来像 BeautifulSoup 3 2 0 Django 1 3 Fabric 1 2 0 Jinja2 2 5 5 PyYAML 3 09 Pygments 1 4 SQLAlchemy 0 7
  • mongodb 聚合随机化(shuffle)结果

    我正在浏览一堆 mongo 文档 但找不到洗牌或随机化结果内容的可能性 有没有 特别是对于聚合框架本身来说 实际上并没有任何本地方法 因为还没有可用的运算符来执行诸如生成随机数之类的操作 因此 无论您可能投射一个字段进行排序的任何匹配 都不
  • 打开和关闭 RDP 窗口

    我有很多服务器 我想检查是否可以使用 RDP 连接到它们 我有 2000 台服务器 所以我想实现自动化 我对 PowerShell 不太熟悉 以下是我所掌握的 列表 txt ip1 ip2 ip3 ipn 这是我的代码 我在每个 ip 上循
  • 解决 emacs 错误的想法:“应用:生成子进程:exec 格式错误”

    我正在尝试将 rdebug 与 emacs 和 cygwin 一起使用 但遇到了麻烦 每当我执行 M x rdebug 并为其提供适当的脚本来运行时 它都会因错误而停止 apply Spawning child process exec f
  • 是否可以在 Cython 中声明和定义位字段?

    在 C C 中你可以声明一个位域 https en cppreference com w cpp language bit field作为结构体 通过指定用于结构体中给定字段的位数 例如 typedef struct char threeB
  • 如何在 ActionBar Sherlock 中使用滑动菜单?

    我正在尝试在使用操作栏 Sherlock 的现有项目中使用滑动菜单 但我无法做到这一点 如果您能给我一个简单的演示或教程来向我展示如何做到这一点 那就太好了 我们必须使用片段来实现滑动菜单吗 Update 当用户单击滑动菜单列表中的某个项目
  • 检查 ARReferenceImage 是否在相机视图中不再可见

    我想检查一下是否AR参考图像 https developer apple com documentation arkit arreferenceimage在相机视图中不再可见 目前我可以检查图像的节点是否在相机的视图中 但是当AR参考图像
  • 将 NSSet 转换为 Swift 数组

    在 CoreData 中我定义了一个无序的一对多关系 这种关系在 Swift 中定义如下 NSManaged var types NSMutableSet 然而 为了最好地使用 Swift 我想使用一个普通的 Swift 数组 比如Type
  • Grails 中数据库迁移的良好工作流程是什么?

    我想使用数据库迁移 http grails org plugin database migration用于数据库迁移的 grails 插件 当我第一次启动 Grails 应用程序时 所有数据库表都会自动创建 我的 DataSource gr