【发布时间】:2019-04-12 13:59:32
【问题描述】:
每次创建新迁移时,都会有我想要的更改,但也有一些不应该存在的更改。它们在每次新迁移中都是相同的。
因此,如果我创建一个没有任何更改的新迁移,那么只会出现那些不需要的更改。如果我运行迁移并创建一个新迁移,这些更改将仍然存在。我可能做错了什么,我想“清理”,以停止每次手动删除这些更改。
我在一个项目中运行 Symfony 4.2.3 和 Doctrine ORM v2.6.3,在 MariaDB 10.3.14 上。
所以这是一个应该为空的迁移:
final class Version20190412133855 extends AbstractMigration
{
// ...
public function up(Schema $schema) : void
{
// this up() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');
$this->addSql('ALTER TABLE player CHANGE race_id race_id INT DEFAULT NULL, CHANGE team_id team_id INT DEFAULT NULL, CHANGE country_id country_id INT DEFAULT NULL, CHANGE birthdate birthdate DATE DEFAULT NULL');
$this->addSql('ALTER TABLE clan_war CHANGE winner_id winner_id INT DEFAULT NULL');
$this->addSql('ALTER TABLE team CHANGE country_id country_id INT DEFAULT NULL, CHANGE manager manager VARCHAR(255) DEFAULT NULL, CHANGE coach coach VARCHAR(255) DEFAULT NULL, CHANGE website website VARCHAR(255) DEFAULT NULL');
$this->addSql('ALTER TABLE map CHANGE tileset_id tileset_id INT DEFAULT NULL');
$this->addSql('ALTER TABLE game CHANGE map_id map_id INT DEFAULT NULL, CHANGE winner_id winner_id INT DEFAULT NULL');
$this->addSql('ALTER TABLE game RENAME INDEX idx_7a5bc50553c55f64 TO IDX_232B318C53C55F64');
}
public function down(Schema $schema) : void
{
// this down() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');
$this->addSql('ALTER TABLE clan_war CHANGE winner_id winner_id INT DEFAULT NULL');
$this->addSql('ALTER TABLE game CHANGE map_id map_id INT DEFAULT NULL, CHANGE winner_id winner_id INT DEFAULT NULL');
$this->addSql('ALTER TABLE game RENAME INDEX idx_232b318c53c55f64 TO IDX_7A5BC50553C55F64');
$this->addSql('ALTER TABLE map CHANGE tileset_id tileset_id INT DEFAULT NULL');
$this->addSql('ALTER TABLE player CHANGE race_id race_id INT DEFAULT NULL, CHANGE team_id team_id INT DEFAULT NULL, CHANGE country_id country_id INT DEFAULT NULL, CHANGE birthdate birthdate DATE DEFAULT \'NULL\'');
$this->addSql('ALTER TABLE team CHANGE country_id country_id INT DEFAULT NULL, CHANGE manager manager VARCHAR(255) DEFAULT \'NULL\' COLLATE utf8mb4_unicode_ci, CHANGE coach coach VARCHAR(255) DEFAULT \'NULL\' COLLATE utf8mb4_unicode_ci, CHANGE website website VARCHAR(255) DEFAULT \'NULL\' COLLATE utf8mb4_unicode_ci');
}
}
所有这些“更改”实际上已经在数据库中完成。
还有一个小问题:生成的查询ALTER TABLE game RENAME INDEX idx_7a5bc50553c55f64 TO IDX_232B318C53C55F64 对MariaDB 无效。如果我不删除此查询,我将收到语法错误。
就像我说的:如果我删除这个,迁移将毫无问题地运行,但如果我创建一个新迁移,则会出现相同的新迁移。
在另一个具有相同配置的项目中,如果我在没有任何更改的情况下进行新迁移,我会得到预期的[WARNING] No database changes were detected.。如果我进行一次更改,我将得到我想要的更改。
我可能在我的实体的注释中做错了什么,所以以防万一,这是模型之一(播放器):https://pastebin.com/1mUPP3i3
感谢您的帮助
【问题讨论】:
-
如果你运行
php bin/console doc:sch:val,你会收到2条“OK”消息吗?如果第一个没问题,那么你的实体没问题。如果第二个是“OK”,则数据库与您的实体配置同步。如果后者不同步,您将获得迁移... -
手动检查一下,您应该会发现这些更改实际上是必要的,以使数据库与您的业务模型(实体)的更改保持一致。但是请注意,由于更新(例如,DoctrineModule)可能会发生一些变化,想想在过去的 2 个月里有一个更新,使所有索引 id 字母大写,这也会重新计算哈希,例如:
RENAME INDEX idx_7a5bc50553c55f64 TO IDX_232B318C53C55F64。 -
关于 MariaDB 支持,请阅读以下内容:doctrine-project.org/projects/doctrine-dbal/en/2.9/reference/… 并确保您到达最后一行;-) 可能会有所帮助(也可能不会,但不会受到伤害):
If you are running a MariaDB database, you should prefix the serverVersion with mariadb- (ex: mariadb-10.2.12). -
确实,现在可以了!应该少读谷歌,多读官方文档。非常感谢您的帮助!
-
一切顺利,尽情享受吧。确保发布一个关于为您解决了什么问题的小答案,并在可能的情况下接受它;)
标签: doctrine-orm migration mariadb symfony4