我如何使用 Flyway,以便如果表被错误地删除,再次运行应用程序时,将创建已删除的表?

Posted

技术标签:

【中文标题】我如何使用 Flyway,以便如果表被错误地删除,再次运行应用程序时,将创建已删除的表?【英文标题】:How do I use Flyway so that if a table gets mistakenly dropped, on running the application again, the deleted table gets created? 【发布时间】:2018-07-11 15:42:23 【问题描述】:

我有一个要求,如果数据库的表被错误地删除,我们需要它回来,不管有没有数据。我们已经使用 Flyway 进行迁移,有什么方法可以使用 Flyway 或其他方式实现吗?

【问题讨论】:

你用的是什么数据库? 【参考方案1】:

我认为您可以使用回调(SQL 或 Java)破解解决方案,但您必须询问如果您首先使用 flyway 来控制对数据库的迁移和修改,如何删除表。

这从根本上是 flyway 旨在防止的,正如 flyway FAQ 中的以下 sn-p 所证实的那样,解决方案可能是首先关闭应用外部修正的可能性。

Can I make structure changes to the DB outside of Flyway?

没有。能够依赖数据库中的元数据并进行可靠迁移的先决条件之一是所有数据库更改均由 Flyway 进行。没有例外。这种可靠性的代价是纪律。临时更改在这里没有空间,因为它们实际上会破坏您的信心。如果之前已经手动添加过,即使是添加索引之类的简单操作也会导致迁移失败。

【讨论】:

【参考方案2】:

versioned migrations 似乎不可能,因为它们只应用一次,或者 repeatable migrations,因为它们只有在校验和更改时才会重新应用。

另一个选项 - 是创建一个callback,它将在迁移后运行。

例如afterMigrate回调可以做到,你只需要在该位置创建一个名为afterMigrate.sql的脚本,用于加载迁移。现在您只需要制作一个 SQL 脚本来重新创建一些表(如果它不存在)。

一些供应商支持这样的选项,例如,使用PostgreSQL,您可以使用CREATE TABLE 查询和IF NOT EXISTS 选项,只创建一个不存在的表。

【讨论】:

以上是关于我如何使用 Flyway,以便如果表被错误地删除,再次运行应用程序时,将创建已删除的表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在flyway migrate上回调?

Flyway:关系“flyway_schema_history”已经存在

使用 RedBean PHP ORM 时如何确保表被某个列索引?

使用 Flyway 更改文件名迁移

使用 flyway 截断所有表

如何最好地处理带有嵌入式数据库的 Flyway 以进行集成测试?