每次迁移时改变 uuid 列的学说

doctrine altering uuid column on every migration

我想知道是否有人遇到过此类问题。我一直在寻找解决方案,但我没有找到。

每次我用学说生成迁移时,我都会在迁移文件中看到:

public function up(Schema $schema): void
{
  $this->addSql('ALTER TABLE verification ALTER id TYPE UUID');
  $this->addSql('ALTER TABLE verification ALTER id DROP DEFAULT');
}


public function down(Schema $schema): void
{
  $this->addSql('ALTER TABLE verification ALTER verification_id TYPE UUID');
  $this->addSql('ALTER TABLE verification ALTER verification_id DROP DEFAULT');
}

这些是我的注释:

use Ramsey\Uuid\Doctrine\UuidGenerator;

/**
 * @ORM\Id
 * @ORM\Column(type="uuid", unique=true)
 * @ORM\GeneratedValue(strategy="CUSTOM")
 * @ORM\CustomIdGenerator(class=UuidGenerator::class)
 *
 * @Groups({"read"})
 **/
 private UuidInterface $id;

我使用 postgress 图像:postgres:13-alpine 和“doctrine/doctrine-migrations-bundle”:“^3.0”,

框架 "api-platform/core": "^2.6",

我已经尝试过以前版本的 doctrine-migrations-bundle 以及 postgres:12

每次迁移都会添加这些更改。我检查了我的本地数据库,删除它,删除 docker 卷。然后我再次启动容器,运行 迁移以确保我得到正确的数据库模式。问题仍然存在。 我不知道是什么原因导致这个问题。也许你们中的一些人知道我可以寻找什么?

您的 composer.lock 中可能有 1.7.0 版本的 ramsey/uuid-doctrine 扩展,因为它在生成架构方面确实存在错误。 这是几天前修复的:https://github.com/ramsey/uuid-doctrine/pull/165

所以尝试降级到 1.6.0:

composer require ramsey/uuid-doctrine:1.6.0

(或升级到最新的开发版本)

说明

之所以 doctrine 不断生成用于更改 uuid 列的迁移,是因为自定义类型 class(即 Ramsey\Uuid\Doctrine\UuidType)缺少 requiresSQLCommentHint 标志(在 1.7.0 中):

    /**
     * {@inheritdoc}
     *
     * @param AbstractPlatform $platform
     *
     * @return bool
     */
    public function requiresSQLCommentHint(AbstractPlatform $platform)
    {
        return true;
    }

此标志告诉 doctrine 使用字段上的注释来确定该字段中的值需要混合到哪个自定义类型中。如果是 Ramsey UuidType,注释应如下所示:(DC2Type:uuid)

作为快速解决方法,您甚至可以手动添加注释(无需升级 ramsey/uuid-doctrine 包):

   COMMENT ON COLUMN verification.id IS '(DC2Type:uuid)'

或通过迁移:

   $this->addSql('COMMENT ON COLUMN verification.id IS \'(DC2Type:uuid)\'');