3

如果 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 没有依赖关系。

4

1 回答 1

5

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

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

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

于 2019-05-03T15:09:27.447 回答