3

这个问题是 Sqitch 特有的,但可能与其他数据库迁移管理工具有关。

我的应用程序中的第一个 Sqitch 更改定义了它的一般模式:它创建了我所有的表表并定义了它们的列。

假设第一个更改名为appschema,并且它创建的一个表lessons包含列chaptersectiontitle

现在,稍后已经部署了一些更改,我想title从表中删除该列lessons

我运行sqitch add move_lesson_titles_out_of_db并将更改的deploy脚本编写为

ALTER TABLE lessons DROP COLUMN title;

sqitch deploy对我的本地开发目标,它按预期工作。

但是现在, sqitch verify dev失败了,因为appschema更改的验证脚本看起来是为了确认该title列存在。到目前为止,我已经能够运行sqitch verify dev并且之前的所有更改都会通过。也许这是我的误解,但我的印象是,所有更改都应该在正确部署和最新的 Sqitch 目标上按顺序运行时继续验证。

可以 sqitch rework appschema添加更改,但 Sqitch 文档非常清楚原始和重新修改的更改都必须是幂等的,并且由于appschema包含一堆CREATE TABLEs,它已经不是幂等的。此外,如果我正确理解了 sqitch,部署这个重做appschema将恢复我的所有更改(因为这是我计划中的第一个更改),回到一个空数据库,然后重播所有内容。

我最终会得到正确的架构,但代价是删除所有数据。显然,这不是我打算在我的生产目标上做的事情。

有没有更好的方法来添加删除列的更改,而sqitch verify不会在创建该列的早期更改上失败?还是这种验证失败是设计使然?

如果按照设计,有什么方法我仍然可以从验证更改所做的许多其他事情中受益,而这些事情随后没有改变(即定义我的应用程序架构的整个其余部分)?appschema

4

0 回答 0