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

标签 postgresql symfony doctrine-orm api-platform.com

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

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

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 和“学说/学说-迁移包”:“^3.0”,

框架 "api-平台/核心": "^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 列的迁移,是因为自定义类型类(即 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)\'');

关于postgresql - 每次迁移时改变 uuid 列的学说,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69741672/

相关文章:

python - Django 树表的复杂分区和排序

symfony - Twig是否包括用于自动链接文本的过滤器?

php - 您必须设置 php-http/httplug-bundle 以使用默认的 http 客户端服务

symfony - 与额外字段的多对多自关系?

php - Adodb 使用 php 和 PostgreSQL

php - 在 PHP PDO 中如何获取 PostgreSQL upsert 查询的 "RETURNING"子句值

mysql - doctrine2 模式更新删除外键约束

doctrine-orm - Doctrine 2 中的可空 manyToOne 关系

hibernate - 使用 PostgreSQL 触发器和 hibernate 时出现意外的行计数

api - 优化 Symfony 中的 API 调用