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

时间:2019-07-18 18:27:46

标签: php symfony doctrine-orm symfony4 doctrine-migrations

我最近在调整数据库,发现在现有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 个答案:

答案 0 :(得分:3)

不,通常,您不应执行任何一项操作。首先,让我澄清一下似乎存在的误解:迁移不包含完整的数据库架构,仅包含将数据库从一个版本移植到另一个版本所必需的查询。该系统允许对数据库更改进行管理和版本控制。因此,您应该开始发现与此有关的一些问题:

  • 迁移可能取决于先前的迁移。例如。 v1添加一个实体,v2添加一个新字段。如果删除v1,则v2将被破坏,并且也需要删除。
  • 由于通常 数据库迁移与对象模型更改紧密相关,因此您还必须还原模型,否则会发现字段不存在的映射问题。

在您尚无任何功能的设计阶段,这可能是可以接受的。您可以使用bin/console doctrine:migrations:execute --down <version>还原单个迁移。如果需要进行调整,通常在测试更改时完成。但是通常当尚未进行更改时。

Doctrine使用名为migration_versions的数据库表来跟踪迁移。通过使用日期命名它们,它可以对它们进行排序并依次应用它们。每当执行迁移时,它将迁移名称添加到此表中。当您将其回滚时,它将与迁移本身中的字段一起从表中删除。请记住,即使您可以回滚迁移,也并不意味着一切都会恢复原样。如果迁移删除某个列,则将在回滚时重新创建该列,但数据将丢失。

至于“可以做到”吗?是。如果您确实想要,请仔细阅读documentation并了解所有这些内容。

因此,由于您的问题与合并迁移有关,因此让我们解决您的实际选择:

  • 是否可以手动删除它们(在PHPStorm中右键单击,然后单击“删除”),然后转到命令行并执行php bin/console doctrine:migrations:migrate

不,这不起作用。 migrate应用迁移。它们将不会是任何东西,并且如所解释的那样,修订仍将在表中,并且会应用其更改。

  • 还是我需要做php bin/console doctrine:schema:update

这也不会做任何事情,因为它将模型与数据库进行比较并发现它们匹配。

无论如何,您将需要先还原它们,然后再创建一个等效的。该命令是doctrine:migrations:diff。这会将模型与模式进行比较,并生成迁移以使数据库同步。为此,您需要先execute --down进行迁移,否则将不会进行任何更改,但可能会丢失一些数据。

如果您在团队中工作,他们将看到迁移消失。有些甚至可能在历史上落后了,因此未应用 all 迁移。这将很快成为管理难题。 有一个rollup命令(据我了解,从未实际使用过)从表中清除陈旧的迁移,转储完整的模式并应用它。这将是您最好的选择,但是请注意,这很可能会删除您的数据。

您还可以手动组合迁移。它们只是具有updown方法的类。合并所有功能体,应用清理过程并开始工作。

现在,如果您要执行此操作,那应该不成问题。只需用新版本替换过时的版本,并警告所有人。但是,如果您想要做的是根本不存在并且保持整洁的提交历史,那么那时候您的队友可能会想要杀死您,因为这将涉及rewriting history。当您这样做时,他们将不得不重新安排所有工作。

如果您想这样做:

  • 进行备份
  • 尽早介绍您的更改,以免中断。如果数据库中有一些未使用的字段一段时间,直到模型提交赶上来,就可以了。如果您做得晚了,并且某些对象需要它,那么可能会迫使某人创建迁移并破坏您的迁移。
  • 正确处理(最好是第一次尝试)。在您进行了广泛的测试之前,请不要推动。
  • 进行备份

console commands的引用

答案 1 :(得分:0)

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

通常在设计阶段,我们将:

  1. 使用doctrine:schema:update --force直到一切稳定为止
  2. 稳定之后,我们从快照中重置开发数据库
  3. 运行doctrine:migrations:diff,然后在必要时手动添加迁移查询

答案 2 :(得分:-1)

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

默认情况下,表名“ doctrine_migration_version ”只会删除不必要的版本行