不,通常你不应该这样做。让我首先澄清一个似乎是误解的东西:迁移不包含完整的数据库模式,只包含将数据库从一个版本带到下一个版本所需的查询。该系统允许对数据库更改进行管理和版本控制。所以你应该开始看到一些问题:
- 迁移可能取决于以前的迁移。例如,v1 添加一个实体,v2 添加一个新字段。如果您删除 v1,v2 将被破坏并且也需要被删除。
- 由于数据库迁移通常与对象模型更改同时进行,因此您还必须还原模型,否则您会发现不存在字段的映射问题。
当您还没有任何功能时,这在设计阶段可能是可以接受的。您可以使用 还原单个迁移bin/console doctrine:migrations:execute --down <version>
。如果需要进行调整,这通常在测试更改时完成。但通常当该更改尚未提交时。
Doctrine 使用名为migration_versions
. 通过用日期命名它们,它可以对它们进行排序并按顺序应用它们。每当执行迁移时,它都会将迁移名称添加到此表中。当您回滚它时,它会从表中删除它,以及迁移本身中的字段。请记住,即使您可以回滚迁移,但这并不意味着一切都会保持原样。如果迁移删除了列,该列将在回滚时重新创建,但数据将丢失。
至于“可以做到”吗?是的。如果您真的想要,请彻底阅读文档并了解所有这些。
因此,由于您的问题是关于合并迁移,让我们来解决您的实际选择:
- 我可以手动删除它们(右键单击 PHPStorm 然后删除)然后转到命令行并执行
php bin/console doctrine:migrations:migrate
吗?
不,这行不通。migrate
将应用可用的迁移。它们不会有任何变化,正如解释的那样,修订仍将在表中并应用其更改。
- 还是我需要做
php bin/console doctrine:schema:update
?
这也不会做任何事情,因为它将模型与数据库进行比较并发现它们匹配。
在任何情况下,您都需要先还原它们,然后再创建一个等效的。的命令是doctrine:migrations:diff
。这会将模型与模式进行比较并生成迁移以使数据库同步。为此,您需要先进行execute --down
迁移,否则它们不会有任何更改,但可能会在此过程中丢失一些数据。
如果你在一个团队中工作,他们会看到迁移消失。有些甚至可能在历史上落后并且没有应用所有迁移。这很快就会成为管理上的痛点。有一个rollup
命令(根据我的理解并且从未实际使用过)从表中清除过时的迁移,转储完整的模式并应用它。这将是您最好的选择,但请注意,这很可能会删除您的数据。
您还可以手动组合迁移。它们只是带有up
和down
方法的类。结合所有函数体,应用清理过程并收工。
现在,如果您想这样做,这应该不是什么大问题。只需用新版本替换过时的版本并警告所有人。但是,如果您想要做的是因为它们根本不存在并保持整洁的提交历史,那么那时您的队友可能会想要杀死您,因为这将涉及重写历史。当你这样做时,他们将不得不重新调整他们所有的工作。
如果你想这样做:
- 进行备份
- 尽早介绍您的更改以避免中断。如果数据库中有一些未使用的字段一段时间是可以的,直到模型提交赶上。如果你做晚了并且某些对象需要它,那么有人可能会被迫创建迁移并在此过程中破坏你的迁移。
- 做对了(最好是第一次尝试)。在您进行广泛的测试之前不要推动。
- 进行备份
控制台命令参考