使用 sqitch 恢复特定更改?

lda*_*cey 4 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.' 
Run Code Online (Sandbox Code Playgroud)

我可以更改表格并添加列,但是当这是一个新的第一天项目时,有一个干净的记录是很好的。

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

the*_*ory 7

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

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

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