对于postgres来说,我很陌生,并且一段时间以来来自MySQL的SQL已经过时了。
我想要实现的是使用现有的数据库结构生成转储文件,然后我可以使用该结构将更改部署到可能已经包含该数据库的环境中。
我认为这意味着转储可能包含以下内容:
CREATE
查询(条件如'如果不存在'...)ALTER
查询ALTER
查询我现在对转储数据不感兴趣。
显然,这需要能够创建不存在的数据库结构,但主要是我对运行数据库已存在的脚本感兴趣,但结构不是最新的。这个想法是,它会添加不存在的相关字段/键/等,使数据库保持最新状态。
我知道部署是软件工程的常规部分,所以我假设有:
请提供以上其中一项作为答案。 :)
答案 0 :(得分:1)
通常,您可以首先自动执行更改,然后在部署到每个实例时应用相同的自动化。像Liquibase这样的工具可以帮到你。
很多有充分的理由没有像你描述的那样完成:
有些事情,比如列数据类型更改,非常很难处理。您ALTER
从text
到integer
USING (NULLIF(trim(column)::integer, ''))
的列''
删除空白并将NULL
转换为DROP TABLE mytable; CREATE TABLE mytable(...)
。转储如何知道这样做?
有时变化似乎没有净效应,但实际上非常重要。 ALTER TABLE mytable ...
与void __fastcall TForm1::Button1Click(TObject *Sender)
{
HPEN hpen, hpenOld;
HBRUSH hbrush, hbrushOld;
HDC hdc = this->Canvas->Handle;
// Red pen for the border
hpen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
// Blue brush for the interior.
hbrush = CreateSolidBrush(RGB(0, 0, 255));
// Select the new pen and brush then draw a rectangle.
hpenOld = SelectObject(hdc, hpen);
hbrushOld = SelectObject(hdc, hbrush);
Rectangle(hdc, 100,100, 400,250);
// After using your objects, delete them and restore the originals
SelectObject(hdc, hpenOld);
DeleteObject(hpen);
SelectObject(hdc, hbrushOld);
DeleteObject(hbrush);
}
非常不同,因为它会破坏数据,但当您只是查看数据库状态时,您看不到它。
有时当你在查看状态A和B时,很难说出从A到B实际需要哪些转换。可能有很多方法可以做到,或者它可能是不可能的没有通过一些非明显的中间状态。
尝试同步数据定义是一种非常笨拙的方法,很可能会破坏它。
使用架构版本控制工具,可以基于已知的起始架构版本和定义良好的转换集(迁移)以受控方式进行一系列更改。一些框架提供内置的此类设施。对于其他人,您可以使用Liquibase等工具。