要使用sqitch恢复特定的更改吗?

时间:2019-04-23 10:05:13

标签: sqitch

如果sqitch中没有依赖项,是否可以还原特定更改?例如,我像下面的代码一样设置我的项目,然后部署它并加载一些数据。大约一天后(或可能是同一天),利益相关者决定我需要在fct_tickets中添加更多列或对该表进行另一次更改。

如果我尝试还原fct_tickets,它将还原所有后续表,这很可惜,因为我已经将数据加载到它们了。

我已经尝试过某些标志(--upon,-unto等),但是它仍然想要还原sqitch.plan文件中的fct_tickets之后的所有内容。

sqitch add scm_example --template pg_create_schema -s schema=example -n 'Create schema for Example data.'
sqitch add fct_tickets --requires scm_example -n 'Create table for ticket data.'
sqitch add fct_chats --requires scm_example -n 'Create table for chat data.'
sqitch add fct_calls --requires scm_example -n 'Create table for call data.'
sqitch add dim_users --requires scm_example -n 'Create table for user mapping data.'
sqitch add dim_source_files --requires scm_example -n 'Create table to track all files downloaded from the SFTP.' 

我可以更改表并添加列,但是当这是一个刚开始的第一天项目时,拥有一块干净的石板就很好了。

没什么大不了的-我只是想知道我是否缺少简单的东西,因为fct_tickets没有依赖项。

1 个答案:

答案 0 :(得分:1)

否,除了最近部署的更改外,您无法还原任何更改。这是设计使然。 Sqitch使用类似于Git和Blockchain的Merkle tree pattern来确保部署完整性。这意味着部署是按计划文件中指定顺序的链接链。如果已将Sqitch项目部署到已加载数据的环境中,则最好添加新的更改以添加新的列。

在生产版本发布之前进行数据库开发时,我经常遵循的一种模式是经常对变更进行基础化。这意味着更改fct_tickets部署脚本以添加新列,然后对fct_tickets^进行折扣,这将在fct_tickets之前的更改之后还原所有更改,然后重新部署它们。在开发过程中,我避免在此类系统中加载数据,而要么将对数据模型至关重要的数据保留在单独的更改中,要么保留在独立加载的单独文件中,例如单元测试夹具。

如果您有一个测试系统或其他人添加了数据的东西,并且它不是最终的标记版本,那么最好的选择可能是将fct_tickets表转储到文件中,并以更改为基础,然后从该文件重新加载数据。在将数据加载到修改后的表中之前,请确保在该列上设置默认值,或者修改转储文件以在每行中添加数据。