Symfony 5:基表或视图已存在:1050表'migration_versions'已经存在

ccrfmcuu  于 2023-03-03  发布在  其他
关注(0)|答案(3)|浏览(107)

我有一个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)$~

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

编辑1:以下是doctrism_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表的创建。在这三个迁移中,没有任何一个创建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),没有出现错误。所以我认为问题不在于迁移本身。

4dbbbstv

4dbbbstv1#

每次运行迁移命令时,doctrine迁移程序都会检查迁移表是否存在。迁移程序通过doctrine架构管理器进行检查。在您的情况下,isInitialized方法似乎总是返回false
您可以调试isInitialized方法,尤其是行$this->schemaManager->tablesExist([$this->configuration->getTableName()])
Doctrine通过从information_schema(用于MySQL)中获取一个表列表来检查一个表是否存在。

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

在您的情况下,information_schema.tables和数据库中的表之间似乎存在不同步。
更快的解决方案:更改数据库名称

wmtdaxz3

wmtdaxz32#

尝试运行以下命令:
bin/console原则:模式:更新
doctrine:schema:update --强制执行命令doctrine:schema:update --dump-sql将SQL语句转储到屏幕
要查看::https://symfony.com/doc/current/DoctrineMigrationsBundle/index.html

mf98qq94

mf98qq943#

对我来说,问题在于数据库权限,我使用的是postgres数据库,而我的migration_table位于特定的模式中,我必须将该模式的所有权限授予我的用户,这非常有效,我不确定原则使用的是什么权限,但您可以尝试将DB用户更改为超级用户

相关问题