用 sqitch 恢复特定的变化?

Posted

技术标签:

【中文标题】用 sqitch 恢复特定的变化?【英文标题】:Reverting a specific change with sqitch? 【发布时间】:2019-04-23 10:05:12 【问题描述】:

如果在 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.' 

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

感谢您提供详细信息。我做了一些单独的 'sqitch add' 条目来添加额外的列,但我会记住 rebase 方法。感谢您的回复和工具 - 它很棒。在找到 sqitch 之前,我刚刚开始使用 Alembic,但我更喜欢只使用纯 SQL 进行迁移。

以上是关于用 sqitch 恢复特定的变化?的主要内容,如果未能解决你的问题,请参考以下文章

23种设计模式(十六)——备忘录模式状态变化

docker专题

git专题

Git

gitHub相关

AnyLogic 中的参数变化:特定变化的数据