【问题标题】:Symfony 5: Base table or view already exists: 1050 Table 'migration_versions' already existsSymfony 5:基表或视图已经存在:1050 表'migration_versions'已经存在
【发布时间】:2021-04-08 20:42:48
【问题描述】:

我有一个 Symfony 5 应用程序,其中包括三个学说迁移。我尝试运行以下命令:

bin/console doctrine:database:drop --force
bin/console doctrine:database:create
bin/console doctrine:migrations:migrate

...但是在运行第三个命令时,出现以下错误:

In AbstractMySQLDriver.php line 38:

An exception occurred while executing 'CREATE TABLE migration_versions (version VARCHAR(14) NOT NULL, executed_a
  t DATETIME NOT NULL COMMENT '(DC2Type:datetime_immutable)', PRIMARY KEY(version)) DEFAULT CHARACTER SET utf8mb4
  COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB':

  SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'migration_versions' already exists


In PDOConnection.php line 43:

  SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'migration_versions' already exists


In PDOConnection.php line 41:

  SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'migration_versions' already exists

我已尝试在doctrine.yaml 中添加以下代码:

doctrine:
    dbal:
        url: '%env(resolve:DATABASE_URL)%'
        schema_filter: ~^(migration_versions)$~

...根据this answer on a different question,但这并不能解决问题。我在这里做错了什么?

====

编辑1:这里是doctrine_migrations.yaml的内容:

doctrine_migrations:
    dir_name: '%kernel.project_dir%/src/Migrations'
    # namespace is arbitrary but should be different from App\Migrations
    # as migrations classes should NOT be autoloaded
    namespace: DoctrineMigrations

编辑 2:我仔细检查以确保我的三个迁移中没有一个包含 migration_versions 表的创建。它不是在这三个迁移中的任何一个中创建的。所以这个错误是从哪里来的很神秘。

编辑 3:我运行了这三个命令:

bin/console doctrine:migrations:execute --up --version 20191210174025
bin/console doctrine:migrations:execute --up --version 20201219113811
bin/console doctrine:migrations:execute --up --version 20201221174858

...每次都返回Symfony 5.0.1 (env: dev, debug: true),没有出现错误。所以我认为问题不在于迁移本身。

【问题讨论】:

  • 你能给我们看看你的 migrations.php 或 migrations.yml ...
  • 在没有代码的情况下很难找到解决方案,但是当我阅读您的代码时,我会尝试这样做,每件事似乎都是正确的,我的建议是将所有设置恢复为默认值,清空您的 symfony 缓存(它可能会导致很多迁移问题)我会使用 rm -rf var/cache/* 不推荐,但只是为了确保所有东西都消失并在创建数据库后运行前 2 个命令 run bin/console d:m :execute --up (迁移编号),然后是所有迁移,让我们知道这种方法是否有效,您能否分享迁移版本
  • 我认为您可以尝试运行每个迁移以找出问题所在的文件。你也可以试试这个 php bin/console 学说:migrations:execute —up [Your version number]
  • @AliMhanna 完成——我在问题的底部添加了一个注释,详细说明了结果。
  • @Patrick 这正是我想检查的迁移是否正确,所以 smoehow 原则也在从另一个地方加载迁移,我猜你做到了,但我要确保你删除所有缓存并尝试使用 d:m:m ?

标签: php symfony doctrine database-migration


【解决方案1】:

每次运行迁移命令时,教义迁移器都会检查迁移表是否存在。迁移者通过doctrine schema manager 进行检查。在您的情况下,isInitialized 方法似乎总是返回false

您可以调试isInitialized 方法。特别是行 $this->schemaManager->tablesExist([$this->configuration->getTableName()])

Doctrine 通过从 information_schema(对于 MySQL)获取表列表来检查表是否存在。 SQL 将是这样的:

SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'databasename'

在您的情况下,information_schema.tables 和数据库中的表之间似乎存在不同步。

更快的解决方法:更改数据库名称

【讨论】:

  • 这是一个很好的答案。但是我正在运行的bin/console doctrine:database:drop --force 命令不应该删除这种不同步吗?我真的不想将“更改数据库名称”放入存储库的自述文件中。 :-)
  • 也许使用 flush 从现有缓存文件中删除“旧”名称,或者甚至在 create 命令之前清除缓存 (bin/console cache:clear) 会有所帮助吗?
  • @craigh 这是个好主意,但在这种情况下,它没有用。我从字面上清除了该过程的每个步骤之间的缓存,但我仍然遇到相同的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 2022-07-09
  • 2020-05-16
  • 1970-01-01
  • 2018-02-18
  • 2016-01-28
相关资源
最近更新 更多