【发布时间】:2020-08-25 15:16:16
【问题描述】:
我的 migration_versions 做了一些可怕的错误,现在从迁移文件夹中删除了版本,当我尝试运行与迁移有关的任何事情时,我得到了这个错误。有人可以指点我从哪里开始解决这个问题吗?
如果我删除数据库然后删除make:migration,则migration_versions 表将出现在数据库中。之后,如果我尝试运行
php 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_at
DATETIME NOT NULL COMMENT '(DC2Type:datetime_immutable)', PRIMARY KEY(version)) DEFAULT CHARACTER SET utf8mb4 COLL
ATE `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
如果我从数据库中删除该表,我就可以运行 php bin\console doctrine:migrations:migrate 了。但是,当尝试运行任何进一步的 make:migration/doctrine:migrations:migrate 命令时,我收到与之前相同的错误,指出表 migration_versions 存在。
【问题讨论】:
-
迁移不是幂等的,你不能多次运行它们。 migration_versions 表本质上会记住您已经运行了哪些迁移,因此不要再次运行它们。一个相当手动的任务是通过教义迁移版本命令添加已经完成的迁移:doctrine-project.org/projects/doctrine-migrations/en/2.2/…(小心使用!)
-
另外,我相信 make:migrations 是为一次性设置而设计的,当你没有数据库时,之后只使用学说:migrations:diff,或者你删除所有迁移并开始干净
-
删除数据库并从迁移中删除所有版本后,我使用
bin/console make:migration创建了一个新版本,然后为migration_versions创建了一个空表。我会假设我应该能够运行bin/console doctrine:migrations:migrate,但我得到了错误。
标签: php mysql symfony doctrine