问题:在每次迁移时更改 uuid 列的原则

如果有人遇到这种问题,我有一个问题。我一直在寻找解决方案,但我没有找到。

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

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;

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

框架“api平台/核心”:“^2.6”,

我已经尝试过以前版本的学说迁移捆绑以及 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

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

解释

教义不断生成迁移以更改 uuid 列的原因是自定义类型类(即Ramsey\Uuid\Doctrine\UuidType)错过了 requiresSQLCommentHint 标志(在 1.7.0 中):

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

此标志告诉教义使用字段上的注释来确定该字段中的值需要水合到哪个自定义类型。对于 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)\'');
Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐