使用 sqitch 恢复特定更改?

Reverting a specific change with sqitch?

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

进行另一次更改

如果我尝试还原 fct_tickets,它将还原所有后续的 table,这很遗憾,因为我已经向它们加载了数据。

我已经尝试了某些标志(--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.' 

我可以更改 table 并添加专栏,但是当它是第一天的新项目时,最好有一个干净的石板。

没什么大不了的 - 我只是想知道我是否遗漏了一些简单的东西,因为 fct_tickets 没有依赖关系。

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

在产品发布之前进行数据库开发时,我经常遵循的一个模式是经常对更改进行变基。这意味着更改 fct_tickets 部署脚本以添加新列,然后在 fct_tickets^ 上重新部署,这将还原 fct_tickets 之前更改之后的所有更改,然后重新部署它们。作为开发过程的一部分,我避免在此类系统中加载数据,而不是将数据模型所必需的数据保存在单独的更改中,或者保存在独立加载的单独文件中,比如单元测试装置。

如果您有一个测试系统或其他人已添加数据的东西,并且它不是最终标记版本,那么您最好的选择可能是将 fct_tickets table 转储到文件,根据更改进行变基,然后从该文件重新加载数据。请务必在列上设置默认值,否则修改转储文件以在将数据加载到修改后的 table.

之前将数据添加到每一行中