这个问题是 Sqitch 特有的,但可能与其他数据库迁移管理工具有关。
我的应用程序中的第一个 Sqitch 更改定义了它的一般模式:它创建了我所有的表表并定义了它们的列。
假设第一个更改名为appschema
,并且它创建的一个表lessons
包含列chapter
、section
和title
。
现在,稍后已经部署了一些更改,我想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 TABLE
s,它已经不是幂等的。此外,如果我正确理解了 sqitch,部署这个重做appschema
将恢复我的所有更改(因为这是我计划中的第一个更改),回到一个空数据库,然后重播所有内容。
我最终会得到正确的架构,但代价是删除所有数据。显然,这不是我打算在我的生产目标上做的事情。
有没有更好的方法来添加删除列的更改,而sqitch verify
不会在创建该列的早期更改上失败?还是这种验证失败是设计使然?
如果按照设计,有什么方法我仍然可以从验证更改所做的许多其他事情中受益,而这些事情随后没有改变(即定义我的应用程序架构的整个其余部分)?appschema