【问题标题】:Redundant changes in new migration新迁移中的冗余变化
【发布时间】: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


【解决方案1】:

感谢@rkeet:

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

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

【讨论】:

    猜你喜欢
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    相关资源
    最近更新 更多