【问题标题】:What is the best way to 'factory-reset' any migrations“恢复出厂设置”任何迁移的最佳方法是什么
【发布时间】:2020-07-22 15:56:43
【问题描述】:

随着迁移重置数据库的最佳方法是什么。

这是我尝试过的。

  1. 删除所有迁移并删除所有数据库表。 然后运行

php bin/console doctrine:mi:diff

php bin/console doctrine:mi:mi

这行不通。

  1. 尝试像这样一次运行单个版本

php bin/console doctrine:migrations:migrate 'DoctrineMigrations\Version20200722104913'

  1. 我试过这个:

php bin/console doctrine:database:drop --force

php bin/console doctrine:database:create

php bin/console doctrine:mi:mi

问题(详细):

我所做的每件事都会导致相同的结果。

Doctrine 认为我还有一些表格要生成,这些表格早已不复存在(不再存在于实体中)

这就是我出现此错误的原因:

执行 'DROP TABLE 时发生异常 问候卡类别':

SQLSTATE[42S02]:未找到基表或视图:1051 未知表 'symfony.greetings_card_category'

我也收到此警告

[警告] 数据库中有 6 个以前执行的迁移未注册。

在我的迁移目录中,我只有两个迁移:

Version20200722104913.php
Version20200722143619.php

如果有帮助的话,这里是状态。

bin/console do:mi:status

| Versions             | Previous             | DoctrineMigrations\Version20200717093052                               |
|                      | Current              | DoctrineMigrations\Version20200722150530                               |
|                      | Next                 | DoctrineMigrations\Version20200722104913                               |
|                      | Latest               | DoctrineMigrations\Version20200722143619                               |
|--------------------------------------------------------------------------------------------------------
| Migrations           | Executed             | 6                                                                      |
|                      | Executed Unavailable | 6                                                                      |
|                      | Available            | 2                                                                      |
|                      | New                  | 2

此时我真的很想拥有 1 个干净的数据库和 1 个迁移。

如何做到这一点?

【问题讨论】:

  • 我已经尝试过几次使用迁移,结果一团糟。我回退到教义:模式:创建,删除和更新。只需清空(或删除)迁移表并避免迁移,至少在您的架构更多或稳定之前。
  • @Cerad 我发布了一个解决方案来避免这种混乱,直到 shema 稳定。 :-)

标签: doctrine-orm doctrine


【解决方案1】:

请注意,如果您在团队中工作或应用程序已经部署,那么拥有一个迁移脚本并不是最好的方法。但是,如果您是唯一的一个开发人员,或者如果您想 rebase 一些提交,您可以这样做。

如果您真的只想拥有一个迁移脚本,这里有一个解决方案。但首先,由于教义使用的migration_table,手动删除数据和表总是一个坏主意。该表包含了学说用来了解数据库当前状态的数据。因此,您手动删除表,您的数据库将与迁移表不同步,并且您的脚本将失败。为了避免您当前的错误,您现在必须截断 migration_table。如果还不够,则删除迁移表,如果不够,则删除并创建数据库(最后一次,因为下面是避免这种不匹配的解决方案。

第 1 步:通过教义降级您的数据库:迁移

php bin/console doctrine:migrations:migrate first -n

在这一步你的数据库是空的。 (提示是关键字“第一”)

第二步:删除(备份后)迁移目录中的所有文件

第 3 步:创建新迁移

php bin/console make:migration

(或者你可以使用symfony console doctrine:migrations:diff,如果你不使用make-bundle)

第 4 步:验证并在必要时手动编辑创建的文件。

第五步:升级你的数据库

php bin/console doctrine:migration:migrate -n

【讨论】:

  • 工作就像一个魅力。
【解决方案2】:

进行一次迁移并不是最好的方法,尤其是当您在一个团队中工作并在不同的分支中执行某些功能时。通过一次迁移,很容易搞砸并做错事,就像你的情况一样。因此,可以进行多次迁移。

你的错误呢,你可以手动编辑你的迁移并修复所有错误,然后运行 ​​diff 和迁移(如果需要),或者你可以删除你的数据库,删除所有迁移并创建一个新的,然后在之后创建迁移修改代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 2015-11-23
    • 2020-04-15
    • 2013-04-09
    • 2010-09-15
    相关资源
    最近更新 更多