ULID가 데이터베이스에 UUID로 잘못 저장됨(바닐라 심포니 애플리케이션)
P粉381463780
P粉381463780 2023-12-16 08:43:42
0
1
647

어제 저는 Symfony가 일부 블로그 게시물(https://symfony.com/blog/new-in-symfony-5-2-doctrine-types-for-uuid-and-ulid)에서 외친 내용을 수행하려고 시도했지만 실패했습니다. ULID("TTTTTTTTTTRRRRRRRRRRRR" 형식)를 데이터베이스에 저장하고 싶습니다. ULID는 정렬이 가능할 뿐만 아니라 내 애플리케이션에 딱 맞는 타임스탬프도 포함하고 있기 때문입니다. 그러나 속성을 "type=ulid"로 지정하면 데이터베이스에 UUID(형식: "xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx")로 저장됩니다.

반나절 동안 디버깅을 했는데 너무 짜증이 나서 처음부터 다시 시작했는데 문제가 계속 발생합니다.

내가 어디서 잘못됐나요?

(원하시면 ULID 헤더로 건너뛰세요. 다음 내용이 길어 보일 수 있지만 50%는 기본 사항입니다.)

심포니

내가 반복적으로 하는 일 https://symfony.com/doc/5.4/setup.html에서 가져옴:

  1. stat shyt # 不存在
  2. composer 创建项目 symfony/sculpture:5.4.* shyt
  3. cd shyt;作曲家需要 webapp
  4. 레시피에 Docker 구성을 포함하시겠습니까? 예(기본값)
  5. bin/console about Symfony 버전 5.4.10 및 PHP 7.4 표시

ORM

https://symfony.com/doc/5.4/doctrine.html에서 발췌:

  1. composer 需要 symfony/orm-pack
  2. composer 需要 --dev symfony/maker-bundle
  3. docker-compose up -d

오류: 네트워크에 할당된 기본 주소 풀에서 사용 가능한 중복되지 않는 IPv4 주소 풀을 찾을 수 없습니다

그래서 docker-compose.override.yml 파일에 다음 줄을 추가했습니다.

으아아아
  1. 호스트 "10.1.2.3"에 대해 ".env"에 DATABASE_URL을 설정하세요
  2. bin/console 学说:数据库:create (어리석지만 문서에 나와 있듯이)

default라는 연결에 대해 'app' 데이터베이스를 생성할 수 없습니다. 쿼리를 실행하는 동안 예외가 발생했습니다: SQLSTATE[42P04]: 중복된 데이터베이스: 7 오류: 데이터베이스 "app"이 이미 존재합니다

그렇습니다. Docker는 이미 이 작업을 수행하고 있습니다.

  1. make:entity ULID 기능이 탑재될 때까지 지연됩니다.

ULID

우리는 https://symfony.com/doc/5.4/comComponents/uid.html(특히 ULID 부분)을 참고했습니다:

  1. composer 需要 symfony/uid
  2. bin/console make:entity Product
  • "ulid"로서의 "someProperty"는 null을 허용하지 않습니다
  1. 상품 확인

추가 필드(기본 키, 정수)와 일부 getter/setter가 있다는 점을 제외하면 문서와 거의 동일해 보입니다.

  1. bin/console make:migration

ULID 엔터티 테스트

그 사이에는 테스트를 사용하여 프로그래밍 방식으로 데이터베이스 항목을 생성합니다.

  1. composer 需要 phpunit 프로그래밍 방식으로 데이터베이스 항목 만들기
  2. bin/console --env=测试主义:migrations:migrate
  3. bin/console --env=测试主义:数据库:create
  4. "tests/FooTest.php" 파일에는 다음이 포함됩니다:
으아아아
  1. bin/console --env=test 主义:query:sql 'TRUNCATE Product' 확실히 하기 위해
  2. bin/phpunit
  3. bin/console --env=测试主义:query:sql 'SELECT * FROM 产品'

ULID가 아닌 UUID를 표시합니다.

데이터베이스에 UUID 대신 ULID 표시

ULID를 기본 키로 사용

먼저 정리한 다음 https://symfony.com/doc/5.4/comComponents/uid.html#ulids에 표시된 예제를 실행합니다.

  1. rm 迁移/* 다시 시작하세요
  2. bin/console --env=测试主义:database:drop --force
  3. bin/console --env=测试主义:数据库:create
  4. bin/控制台主义:数据库:drop --force
  5. bin/console --env=测试主义:数据库:create
  6. 문서의 두 번째 ULID만 포함하도록 "src/Entity/Product.php"를 편집합니다. 예:
으아아아

(문서의 예에는 저장소 줄이 누락되어 있습니다)

  1. bin/console make:migration
  2. bin/console --env=测试主义:migrations:migrate
  3. 테스트가 더욱 쉬워졌습니다.
으아아아
  1. bin/phpunit(위험해도 괜찮아)
  2. bin/console --env=测试主义:query:sql 'SELECT * FROM 产品'

ULID 대신 UUID를 다시 사용하세요

데이터베이스에 ULID 대신 UUID가 표시됨

P粉381463780
P粉381463780

모든 응답(1)
P粉377412096

조금 늦었지만 이 문제에 직면한 사람을 위해 ULID 대신 UUID를 표시하는 데이터베이스도 있습니다. 이는 UUID/ULID를 서로 바꿔서 사용할 수 있으므로 Doctrine에서 예상되는 동작인 것 같습니다. 데이터베이스이지만 엔터티가 ULID에 매핑되어 있는 경우 데이터베이스에서 개체를 검색할 때 ULID가 있으므로 ULID 또는 UUID를 사용하여 동일한 개체를 검색할 수도 있습니다.

예를 들어 식별자에 ULID가 있는 사용자 엔터티가 있으므로 저장된 개체에는 다음과 같은 uuid가 있습니다.

으아아아

해당 UUID를 사용하여 사용자를 검색하면 다음을 얻습니다.

으아아아

이제 해당 ULID를 사용하여 사용자를 검색하면 작동합니다!

UUID를 검사하면 반환된 객체에 uuid가 베이스 32로 변환된 것을 볼 수 있습니다.

으아아아

마지막으로 다음과 같이 refc4122로 변환하여 저장된 uuid를 얻을 수 있습니다.

으아아아

Principle이 왜 ULID만 저장하지 않는지는 잘 모르겠지만, 현재 동작으로 인해 프로젝트에서 ULID를 사용하는 것이 방해되지는 않습니다. 도움이 되었기를 바랍니다!

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿