ULID在数据库中错误地存储为UUID(vanilla symfony应用程序)

ymdaylpp  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(94)

昨天,我尝试了Symfony在博客文章(https://symfony.com/blog/new-in-symfony-5-2-doctrine-types-for-uuid-and-ulid)中的做法,但是失败了。我想在数据库中存储ULID(格式为“TTTTTTTTTTTTRRRRRRRRRRRRRR”),因为它们不仅可以排序,而且还包含一个时间戳,这对我的应用程序来说是完美的。但是当我告诉一个属性为“type=ulid”时,它被存储为UUID(格式为:“xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx”)。
我调试了半天,对此感到非常恼火,我从头开始,问题仍然存在。
我哪里做错了?

  • (如果您愿意,可以跳到ULID标题,以下内容可能看起来很长,但其中50%都是基本内容)*

赛姆芬尼
我反复做的事情取自https://symfony.com/doc/5.4/setup.html

  1. stat shyt # does not exist
  2. composer create-project symfony/skeleton:5.4.* shyt
  3. cd shyt; composer require webapp
    1.是否要包括配方中的Docker配置?是(默认)
  4. bin/console about显示Symfony版本5.4.10和PHP 7.4

ORM

取自https://symfony.com/doc/5.4/doctrine.html

  1. composer require symfony/orm-pack
  2. composer require --dev symfony/maker-bundle
  3. docker-compose up -d
    错误:在默认值中找不到可用的非重叠IPv4地址池以分配给网络
    因此我在docker-compose.override.yml文件中添加了一些行:
networks:
  default:
    ipam:
      config:
        - subnet: 10.1.2.1/24

services:
  database:
  # [...] doctrine/doctrine-bundle stuff [...]
  networks:
    default:
      ipv4_address: 10.1.2.3

1.在“.env”中,为主机“10.1.2.3“设置DATABASE_URL

  1. bin/console doctrine:database:create(愚蠢,但已记录)
    无法为名为default的连接创建数据库“app”执行查询时出现异常:SQL状态[42 P04]:重复的数据库:7错误:数据库“app”已存在
    是的,多克已经做过了.
  2. make:entity被推迟到我们拥有ULID功能之后。

ULID

我们已经学习了https://symfony.com/doc/5.4/components/uid.html(特别是ULID部分):

  1. composer require symfony/uid
  2. bin/console make:entity Product
  • 作为“ulid”的“someProperty”不可为空

1.检查产品实体
看起来几乎像文档中的一样,除了它有一个额外的字段(主键,一个整数)和一些getter/setter。

  1. bin/console make:迁移

测试ULID实体

在此期间,我们使用测试以编程方式创建DB条目:

  1. composer require phpunit以编程方式创建数据库条目
  2. bin/console --env=test doctrine:migrations:migrate
  3. bin/console --env=test doctrine:database:create
    1.文件“tests/FooTest.php”包含:
<?php

namespace App\Tests;

use App\Entity\Product;
use App\Repository\ProductRepository;
use Doctrine\ORM\EntityManager;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Uid\Ulid;

class FooTest extends KernelTestCase
{
    public function testFoo(): void
    {
        $product = new Product();
        $product->setSomeProperty(new Ulid());
        static::assertNotNull($product->getSomeProperty());

        self::getContainer()->get(ProductRepository::class)
            ->add($product);

        self::getContainer()->get('doctrine.orm.entity_manager')
            ->flush();
    }
}
  1. bin/console --env=test doctrine:query:sql 'TRUNCATE product'只是为了确保
  2. x1米15英寸
  3. bin/console --env=test doctrine:query:sql 'SELECT * FROM product'

显示UUID而不是ULID。

Shows ULID instead of UUID in the database

使用ULID作为主键

首先清理一下,然后执行https://symfony.com/doc/5.4/components/uid.html#ulids:

  1. rm migrations/*重新开始
  2. bin/console --env=test doctrine:database:drop --force
  3. x1米19英寸1x
  4. x1米20英寸
  5. bin/console --env=test doctrine:database:create
    1.编辑“src/Entity/Product.php”,使其仅包含文档中的第二个ULID示例:
<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Uid\Ulid;
use App\Repository\ProductRepository;

/**
 * @ORM\Entity(repositoryClass=ProductRepository::class)
 */
class Product
{
    /**
     * @ORM\Id
     * @ORM\Column(type="ulid", unique=true)
     * @ORM\GeneratedValue(strategy="CUSTOM")
     * @ORM\CustomIdGenerator(class="doctrine.ulid_generator")
     */
    private $id;

    public function getId(): ?Ulid
    {
        return $this->id;
    }

    // ...

}

(文档中的示例缺少存储库行)

  1. bin/console make:migration
  2. bin/console --env=test doctrine:migrations:migrate
    1.测试现在简单一点:
public function testFoo(): void
    {
        self::getContainer()->get(ProductRepository::class)
            ->add(new Product());

        self::getContainer()->get('doctrine.orm.entity_manager')
            ->flush();
    }
  1. bin/phpunit(风险可以接受)
  2. x1米25英寸1x

同样是UUID而不是ULID

Database shows UUID instead of ULID

6yt4nkrj

6yt4nkrj1#

我也在尝试ULID,并遵循相同的文档(https://symfony.com/blog/new-in-symfony-5-2-doctrine-types-for-uuid-and-ulid)。我注意到您在代码中做了一件与文档不同的事情。
在实体变更中:

* @ORM\CustomIdGenerator(class="doctrine.ulid_generator")

* @ORM\CustomIdGenerator(class=UlidGenerator::class)

并添加以下内容

use Symfony\Bridge\Doctrine\IdGenerator\UlidGenerator;

这将使ULID工作。
转储的内容如下所示(抱歉,这是我测试ulid时控制台中的转储,但我希望它能提供您所需的信息):

^ Symfony\Component\Uid\Ulid^ {#842
  #uid: "01G7MCSCANWA2XXZ1NT1TZV6KQ"
  toBase58: "1BoCbKTaPcpbAuQVieEW54"
  toRfc4122: "0181e8cc-b155-e285-defc-35d075fd9a77"
  time: "2022-07-10 15:48:57.813 UTC"
}

在数据库中,它如下所示:Ulid in mariaDB
我希望这能帮上忙。

wdebmtf2

wdebmtf22#

这有点晚了,但对于任何面临这个问题的人来说,我也有一个显示UUID而不是ULID的数据库,这似乎是理论上的预期行为,因为您可以互换使用UUID/ULID,这意味着即使您有UUID存储在数据库中,但您的实体Map到ULID,您在从数据库检索对象时也将有一个ULID,您也可以使用ULID或UUID检索相同的对象。
例如,我有一个用户实体,其标识符为ULID,因此存储的对象将具有如下所示的uuid:

018477e6-eebc-164c-12e3-22ca8f1a88f3    myemail@mail.com    []

如果我用UUID检索我用户,我将得到:

App\Entity\User {#430 ▼
 -id: "01GHVYDVNW2S615RS2SA7HN27K"
 -email: "myemail@mail.com"
 -roles: []
 #createdAt: DateTime @1668458933 {#423 ▶}
 #updatedAt: DateTime @1668458998 {#428 ▶}
 -password: "$2y$13$/2i9Ovc2lCQBRfSVgsnmoul1FhF.Kyki3irF6GQvrMrjacQX6ees6"
 -isVerified: true
}

现在,如果您使用ULID来检索您用户,它也将工作!
如果进一步检查该UUID,您将看到返回的对象将该UUID转换为base 32:

bash-5.1$ bin/console uuid:inspect 018477e6-eebc-164c-12e3-22ca8f1a88f3
----------------------- --------------------------------------
Label                   Value
----------------------- --------------------------------------
Version                 1                                     
  toRfc4122 (canonical)   018477e6-eebc-164c-12e3-22ca8f1a88f3  
  toBase58                1BsMRvKcgozP4Kw2m4Fb1C                
  toBase32                01GHVYDVNW2S615RS2SA7HN27K
----------------------- --------------------------------------

最后,您可以通过将其转换为refc 4122来获取存储uuid,如下所示:

bin/console ulid:inspect 01GHVYDVNW2S615RS2SA7HN27K
---------------------- --------------------------------------
Label                  Value
---------------------- --------------------------------------
toBase32 (canonical)   01GHVYDVNW2S615RS2SA7HN27K
toBase58               1BsMRvKcgozP4Kw2m4Fb1C
toRfc4122              018477e6-eebc-164c-12e3-22ca8f1a88f3
---------------------- --------------------------------------
Time                   2022-11-14 20:48:53.948 UTC
---------------------- --------------------------------------

我不知道为什么doctrine不只是存储ULID,但是它目前的行为并没有阻止你在你的项目中使用ULID。希望这能有所帮助!

相关问题