簡體   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