启动后如何运行 Grails 数据库迁移

Posted

技术标签:

【中文标题】启动后如何运行 Grails 数据库迁移【英文标题】:How to run Grails Database Migration after startup 【发布时间】:2015-12-28 02:33:37 【问题描述】:

对于我的集成测试,我在 bootstrap.groovy 中加载了一个“种子”数据库。 我也在开发过程中不时手动加载不同的数据库来尝试不同的场景。

麻烦的是,数据库迁移插件(非常感谢 Bert!)似乎只在启动期间运行,在进入引导代码之前,我看不到任何可以触发它再次运行的地方。

这意味着如果我加载一个“过时”的数据库,那么我必须关闭应用程序并重新启动它才能完成迁移。然后我必须记住拍摄“新”数据库的快照,这样我下次就不必再这样做了。

所有这些都会真正影响生产力,尤其是在多次重构中。

有没有更好的方法来做到这一点?理想情况下,我想要服务类方法'runMigrations()'或其他东西。然后我可以在加载工具之后或从我的引导代码中调用它。

有什么想法吗?

【问题讨论】:

迁移并非设计为在启动后运行。它们被设计为在启动前运行,因为在启动应用程序之前需要模式正确。您将需要使用其他工具来完成此操作。 【参考方案1】:

这是可能的,在我看来这是一个有效的用例,例如在应用程序启动后运行特定的上下文:

import grails.plugin.databasemigration.MigrationUtils
import liquibase.Liquibase

class DatabaseMigrationService 

  def runMigrationsForContexts(String contexts) 
    def database = MigrationUtils.getDatabase()
    Liquibase liquibase = MigrationUtils.getLiquibase(database)
    liquibase.update(contexts)
  

【讨论】:

【参考方案2】:

保罗,

根据我自己的个人经验,我从未见过迁移插件在启动后运行。我不相信它被编码来做到这一点。在切换数据库时,我的处境与您相似,我只需要不断停止和启动应用程序。

对不起!

【讨论】:

在网上搜索了几天后,我得出了相同的结论,但我不禁感到,因为 Liquibase 是一个单独的应用程序,dbmigration 插件“简单地”调用它应该可以随意调用它,可以这么说。我想我们需要 Bert 的意见......

以上是关于启动后如何运行 Grails 数据库迁移的主要内容,如果未能解决你的问题,请参考以下文章

Grails 3 数据库迁移问题

如何将 Grails 2.1 迁移到 Grails 2.3 应用程序?

在 Grails 中进行数据库迁移的良好工作流程是啥?

Grails 数据库迁移插件问题

grails4中的数据库迁移插件错误

Grails 3 数据库迁移插件初始化错误