setup:upgrade 显示完成,但我刚改过的 Data Patch 一行日志都没有。原因不是缓存:Magento 记录的是“这个补丁类是否执行过”,不会计算文件内容哈希。
SELECT patch_name FROM patch_list
WHERE patch_name LIKE 'Vendor\Module%';
只要类名已经在 patch_list,修改 apply() 后再运行也不会重放。
不要在生产库直接删除patch_list记录
删除记录会让原补丁从头再来。若它创建属性、移动数据或发送业务事件,不具备幂等性时可能产生重复选项、覆盖人工数据,甚至在中途失败。
正确方式是新建第二个补丁类,把“这次新增的变化”写进去,并通过 getDependencies() 声明它依赖第一个补丁。新环境会按顺序执行两个补丁,旧环境只执行新的一个。
补丁是已经发生过的数据库历史,不是可以随意改写的初始化脚本。
本地确实需要反复调试未发布补丁时,可以重建一次性开发数据库;不要把删除 patch_list 当成上线步骤。新补丁还应先判断目标状态,尽量做到重复运行也安全。
验收很简单:全新数据库安装一次,从旧版本升级一次,两条路径得到相同 schema 与数据;再次执行 setup:upgrade 不应产生额外变化。

