Database Postgres转储Alter查询

Database Postgres转储Alter查询,database,postgresql,Database,Postgresql,我对postgres很陌生,很早以前就对来自MySQL的SQL感到生疏 我想要实现的是使用现有的数据库结构生成一个转储文件,然后我可以使用该文件将更改部署到一个可能包含或不包含该数据库的环境中 我假设这意味着转储可能包括以下内容: 空条件为所有表创建查询(条件为“if not exists”…) 所有字段的条件ALTER查询 有条件的ALTER查询所有约束和键(主约束和其他约束) 我现在对转储数据不感兴趣 显然,这需要能够在不存在数据库的情况下创建数据库结构,但我主要感兴趣的是在数据库已经存

我对postgres很陌生,很早以前就对来自MySQL的SQL感到生疏

我想要实现的是使用现有的数据库结构生成一个转储文件,然后我可以使用该文件将更改部署到一个可能包含或不包含该数据库的环境中

我假设这意味着转储可能包括以下内容:

  • 空条件
    为所有表创建
    查询(条件为“if not exists”…)
  • 所有字段的条件
    ALTER
    查询
  • 有条件的
    ALTER
    查询所有约束和键(主约束和其他约束)
我现在对转储数据不感兴趣

显然,这需要能够在不存在数据库的情况下创建数据库结构,但我主要感兴趣的是在数据库已经存在但结构不是最新的情况下运行脚本。其想法是,在不存在相关字段/键/等的地方添加相关字段/键/等,使数据库更新

我知道部署是软件工程的一个常规部分,所以我假设有:

  • 一种简单的方法,或者
  • 这是不这样做的一个很好的理由

请提供上述其中一项作为答案。:)

通常情况下,您可以首先自动化更改,然后在部署到每个实例时应用相同的自动化。像Liquibase这样的工具可以帮助你

有很多很好的理由没有按照你所描述的那样去做:

  • 有些事情,如列数据类型的更改,很难用这种方式处理。您可以使用(NULLIF(trim(column)::integer,)将列从
    text
    更改为
    integer
    ,,以去除空白并将
    '
    转换为
    NULL
    。垃圾场怎么会知道这样做

  • 有时,一个变化似乎没有净效应,但实际上是非常重要的<代码>删除表mytable;CREATE TABLE mytable(…)与ALTER TABLE mytable…非常不同,因为它会破坏数据,但当您仅查看数据库状态时,您看不到这一点

  • 有时,当你观察状态A和B时,很难判断从A到B实际上需要什么转换。可能有很多方法可以做到这一点,或者不经过一些不明显的中间状态是不可能的

尝试同步数据定义是一种非常笨拙的方法,而且很可能会造成破坏


使用模式版本控制工具,这些工具可以基于已知的起始模式版本和定义良好的转换(迁移)集,以可控的方式进行一系列更改。有些框架内置了这样的功能。对于其他人,您可以使用Liquibase等工具。

您需要将其集成到开发周期中,只需通过版本控制下的脚本对数据库进行更改即可。Liquibase是一个很好的工具来管理这样的模式迁移一个diff工具能够(也将要)做的唯一事情就是生成一个
drop table foo
和一个
create table bar