新迁移中的冗余更改

时间:2019-04-12 13:59:32

标签: doctrine-orm migration mariadb symfony4

每次创建新迁移时,都有我想要的更改,但是有些更改不应该存在。在每个新迁移中它们都是相同的。

因此,如果我创建一个没有任何更改的新迁移,则只会存在那些不希望的更改。如果我运行迁移并进行新的迁移,这些更改将仍然存在。我可能做错了一些事情,我想“清理”一下,以便每次都停止手动删除那些更改。

我处于一个在MariaDB 10.3.14上运行带有Symctony 4.2.3和Doctrine ORM v2.6.3的项目中。

这是一个应该为空的迁移:

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.。如果我进行更改,我将得到我想要的更改。 我可能在实体的注释中做错了一些,因此,以防万一,这是模型(玩家)之一:handler

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

感谢@rkeet:

我用doc:sch:val命令检查了映射和数据库出了什么问题。

然后针对MariaDB上的RENAME INDEX语法错误的情况,我在Doctrine Configuration中更改了服务器版本(在我的情况下为Doctrine.yaml) 从server_version: '5.7'server_version: mariadb-10.3.14(使用mysql --version检查当前的mariadb版本)。