从迁移中生成 SQL 而无需全部删除

Posted

技术标签:

【中文标题】从迁移中生成 SQL 而无需全部删除【英文标题】:Generating SQL from migrations without drop-all 【发布时间】:2015-01-21 00:28:11 【问题描述】:

假设我有 3 个提交(每个都添加了新的迁移):

v3(添加新列) v2(添加新表) v1

生产数据库位于v1,我的开发数据库位于v3

我想生成一个 SQL 脚本,它将生产数据库升级到 v3

我知道如何做到这一点的唯一方法是将开发数据库回滚到v1(通过签出v1 并运行dbm-rollback)然后签出v3 并运行dbm-update-sql

有没有办法在不回滚开发数据库的情况下执行此操作(或破解DATABASECHANGELOG 表)?像 dbm-update-count-sql 2 这样的东西会为最后两次迁移创建 SQL,无论它们是否已经在开发中运行。

编辑:无法从开发机器连接到 prod 数据库

【问题讨论】:

【参考方案1】:

如果您使用 updateSQL 生成 SQL,Liquibase 不会更改您指向的数据库,它只会生成在正常更新时会执行的内容。因此,最简单的选择是对您的生产数据库运行 updateSQL 以获取更新它所需的脚本。

如果这对您不起作用,如果您能够将 DATABASECHANGELOG 表备份/恢复到另一个数据库(甚至是空白数据库)并针对该数据库运行 updateSQL,它将输出相同的 SQL。

最后,您可以使用"offline mode" 在运行 updateSQL 时使用 CSV 文件充当 DATABASECHANGELOG 表。使用空表运行将生成所有更新 SQL,但如果您仅包含生产中文件中的更改,updateSQL 将输出更新生产所需的内容。

【讨论】:

【参考方案2】:

如果您可以连接到生产数据库,您只需使用 updateSQL 命令运行 liquibase。

【讨论】:

无法连接到 prod 数据库 :(

以上是关于从迁移中生成 SQL 而无需全部删除的主要内容,如果未能解决你的问题,请参考以下文章

高分求SQL的全部保留字是哪些?

sql拼接错误直到数据全部删除

如何删除一个数据库中某个学生的全部记录

怎样删除mysql一个表中的全部数据

从.NET中生成的XML中删除命名空间[重复]

怎样删除视图中的全部数据 用SQL语言编写。