PostgreSQL:模式差异/补丁工具


14

请考虑以下设置:

  • 生产数据库
  • 开发数据库,​​对其进行架构更改以启用新功能

新功能的开发完成后,我必须手动更新prod db模式,直到pg_dump --schema-only两个DB上的相同。此过程容易出错且乏味。

因此,我正在寻找一种可以实现以下目的的工具:

  • 显示两个架构(例如diff)之间差异的摘要。请注意,我不是在寻找模式的文本差异,而是在寻找可以得出结论的更复杂的工具,例如“表X具有新列Y”。
  • 自动生成将一种模式转换为另一种模式的SQL代码(如patch

是否有一个架构差异 / 补丁工具可以帮助我将产品架构转换为更高级的开发架构?


2
而不是进行比较,您应该以受控方式管理迁移脚本。切勿对DBMS进行临时DDL更改,始终将更改放入脚本(存储在版本控制系统中)中,然后应用该脚本。查看诸如Liquibase或
Flyway之

1
@a_horse_with_no_name谢谢。即使采用这种方法,差异/修补程序工具也可以使我的生活更轻松。顺便说一句,我忍不住哼了歌。
亚当·马坦

您可以尝试pg_comparator:pgfoundry.org/projects/pg-comparator(尽管我从未使用过)。Liquibase也具有内置的差异,如果我没记错的话,它会以Liquibase变更集的形式发出结果,因此这可能是进行更多受控模式管理的良好起点
a_horse_with_no_name 2014年

谢谢。愿意将其发布为答案,以便我可以投票吗?
亚当·马坦

Answers:


11

抱歉复活了一个老问题

最近,我一直在使用JetBrains 的0xDBE DataGrip数据库管理工具。

它在出色的Jetbrains IDE中支持多个数据库引擎,并且我发现一个有用的关键功能是能够diff容纳2个表(DEV和PROD)。

下面是运行中差异的屏幕截图(在这种情况下,只有一列差异)。屏幕截图是顶部“ Merge Right”按钮的结果,生成了使正确的表重新使用所需的SQL。

0xDBE SQL表差异

希望这个新工具能对您有所帮助。


3
复活旧问题没有任何问题(甚至有徽章可以实现)。还有一个问题:是否可以比较整个数据库(我的意思是至少它们中的所有表)?
dezso 2014年

@dezso-感谢您的放心。是的,您可以在数据库,架构和表级别进行比较。
伊万2014年

1
@BasilBourque-从左侧Database菜单中,选择要比较的2个表(带有cmd/ctrl + click),右键单击并选择Compare
Ewan

3
最近,我遇到了一个用python编写的新工具migra。它可以跟踪对表,视图,函数,索引,约束,枚举,序列和已安装扩展的更改,并且还可以用作库
脚本

1
@Ewan另外,migra跟踪两个数据库中的所有内容,包括触发器和函数。但是DataGrip却没有。这就是为什么,我不鼓励使用DataGrip作为差异工具。还存在缺点:1)migra只是PostgreSQL工具;2)migra可以跟踪更改,但并不总是生成适当的DDL运算符,例如alter table ... add column,drop column而不是alter table ...重命名列等。而且我还没有找到任何工具可以生成正确的DDL命令。他们总是需要抛光。同样,如果没有像Liquibase这样的迁移工具,任何数据库修改都将太复杂。
Exterminator19年

6

使用liquibase

它支持diff,从头开始生成数据库,修补数据库,回滚数据库以及许多其他东西。

您过去必须使用liquibase用XML编写所有内容,但现在不再需要。您可以在自己选择的SQL方言中编写其中的99%。例:

--liquibase formatted sql

--changeset neil:1 

create table contacts(
  contact_id serial primary key,
  name text not null unique
);

--changeset neil:2
alter table contacts add column phone_num text;

您应该将您的liquibase更改日志保存在git或您拥有的文件中。


与此有关的一个问题是,它没有正确排序或删除约束和主键。
2015年

2
迁飞类似于Liquibase另一种选择。
罗勒·布尔克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.