繁体   English   中英

Symfony 5:基表或视图已存在:1050 表“migration_versions”已存在

[英]Symfony 5: Base table or view already exists: 1050 Table 'migration_versions' already exists

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

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)$~

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

====

编辑 1:这是教义迁移的内容。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) ,没有出现错误。 所以我认为问题不在于迁移本身。

每次运行迁移命令时,doctrine 迁移器都会检查迁移表是否存在。 迁移器通过doctrine 模式管理器进行检查。 似乎在您的情况下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和表之间似乎存在不同步。

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

ry 运行以下命令:

bin/控制台 doctrine:schema:update

doctrine:schema:update --force 执行命令 doctrine:schema:update --dump-sql 将 SQL 语句转储到屏幕

看:: https://symfony.com/doc/current/DoctrineMigrationsBundle/index.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM