为了账号安全,请及时绑定邮箱和手机立即绑定

Symfony 4:如何安全地“加入”迁移?/ 删除第一个和最后一个之间的迁移?

Symfony 4:如何安全地“加入”迁移?/ 删除第一个和最后一个之间的迁移?

PHP
catspeake 2021-10-15 17:42:12
我最近在调整我的数据库并注意到我在现有的 2 个之上进行了 5 次迁移。总共 7 次,m1、m2、...、m7。从这 5 个中,我只想要最新版本。所以我想我可以删除 m3、m4、m5、m6、m7 并再次迁移,这将导致 m3 已经包含我满意的最终版本。现在我以前从未这样做过,想知道最安全的方法是什么?我正在使用 PHPStorm。我可以手动删除它们吗(在 PHPStorm 中右键单击然后删除)然后转到命令行并执行php bin/console doctrine:migrations:migrate?或者我需要做php bin/console doctrine:schema:update什么?或者这真的是个坏主意?
查看完整描述

3 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

不,通常你不应该这样做。让我首先澄清一个似乎是错误的概念:迁移不包含完整的数据库模式,只包含将数据库从一个版本带到下一个版本所需的查询。该系统允许对数据库更改进行管理和版本控制。所以你应该开始看到一些问题:

  • 迁移可能依赖于前一个。例如 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命令(根据我的理解并且从未实际使用过它)从表中清除过时的迁移,转储完整的模式并应用它。这将是您最好的选择,但请注意,这将删除您的数据。

您还可以手动组合您的迁移。它们只是带有updown方法的类。组合所有函数体,应用清理过程并收工。

现在,如果你想这样做,这应该不是什么大问题。只需用新版本替换过时的版本并警告所有人。但是,如果您想要做的是因为它们根本不存在并保持整洁的提交历史记录,那么这就是您的队友可能想要杀死您的时候,因为这将涉及重写历史记录。当你这样做时,他们将不得不重新调整他们所有的工作。

如果你想这样做:

  • 进行备份

  • 尽早引入您的更改以避免中断。如果数据库中有一些未使用的字段一段时间就可以了,直到模型提交赶上。如果您迟到并且某些对象需要它,则可能有人会被迫创建迁移并在此过程中破坏您的迁移。

  • 做对(最好是第一次尝试)。在您进行广泛测试之前不要推动。

  • 进行备份

控制台命令参考


查看完整回答
反对 回复 2021-10-15
?
www说

TA贡献1775条经验 获得超8个赞

没有一种“安全”的方法可以做到这一点,但是如果您还没有部署迁移,那么您可以安全地丢弃一系列自动生成的迁移并重新生成它们。请注意不要同时丢弃手动迁移 SQL。

通常在设计阶段我们会:

  1. 使用doctrine:schema:update --force直到事情相当稳定

  2. 稳定后,我们从快照重置开发数据库

  3. 运行doctrine:migrations:diff,然后在必要时手动添加迁移查询


查看完整回答
反对 回复 2021-10-15
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

一般来说是的,你可以。但是您应该知道 Doctrine/Migration 将执行的迁移保存在 DB 中。因此,在更新数据库之后,您应该删除不必要的迁移文件(可能将所有查询合并为一个)

表名默认“ doctrine_migration_version ”只是删除不必要的版本行


查看完整回答
反对 回复 2021-10-15
  • 3 回答
  • 0 关注
  • 126 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信