어제 저는 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에서 가져옴:
stat shyt # 不存在
composer 创建项目 symfony/sculpture:5.4.* shyt
cd shyt;作曲家需要 webapp
bin/console about
Symfony 버전 5.4.10 및 PHP 7.4 표시https://symfony.com/doc/5.4/doctrine.html에서 발췌:
composer 需要 symfony/orm-pack
composer 需要 --dev symfony/maker-bundle
docker-compose up -d
오류: 네트워크에 할당된 기본 주소 풀에서 사용 가능한 중복되지 않는 IPv4 주소 풀을 찾을 수 없습니다
그래서 docker-compose.override.yml 파일에 다음 줄을 추가했습니다.
으아아아bin/console 学说:数据库:create
(어리석지만 문서에 나와 있듯이) default라는 연결에 대해 'app' 데이터베이스를 생성할 수 없습니다. 쿼리를 실행하는 동안 예외가 발생했습니다: SQLSTATE[42P04]: 중복된 데이터베이스: 7 오류: 데이터베이스 "app"이 이미 존재합니다
그렇습니다. Docker는 이미 이 작업을 수행하고 있습니다.
make:entity
ULID 기능이 탑재될 때까지 지연됩니다. 우리는 https://symfony.com/doc/5.4/comComponents/uid.html(특히 ULID 부분)을 참고했습니다:
composer 需要 symfony/uid
bin/console make:entity Product
추가 필드(기본 키, 정수)와 일부 getter/setter가 있다는 점을 제외하면 문서와 거의 동일해 보입니다.
그 사이에는 테스트를 사용하여 프로그래밍 방식으로 데이터베이스 항목을 생성합니다.
composer 需要 phpunit
프로그래밍 방식으로 데이터베이스 항목 만들기bin/console --env=测试主义:migrations:migrate
bin/console --env=测试主义:数据库:create
bin/console --env=test 主义:query:sql 'TRUNCATE Product'
확실히 하기 위해bin/phpunit
bin/console --env=测试主义:query:sql 'SELECT * FROM 产品'
ULID가 아닌 UUID를 표시합니다.
데이터베이스에 UUID 대신 ULID 표시
먼저 정리한 다음 https://symfony.com/doc/5.4/comComponents/uid.html#ulids에 표시된 예제를 실행합니다.
rm 迁移/*
다시 시작하세요bin/console --env=测试主义:database:drop --force
bin/console --env=测试主义:数据库:create
bin/控制台主义:数据库:drop --force
bin/console --env=测试主义:数据库:create
(문서의 예에는 저장소 줄이 누락되어 있습니다)
bin/console make:migration
bin/console --env=测试主义:migrations:migrate
bin/phpunit
(위험해도 괜찮아)bin/console --env=测试主义:query:sql 'SELECT * FROM 产品'
ULID 대신 UUID를 다시 사용하세요
데이터베이스에 ULID 대신 UUID가 표시됨
조금 늦었지만 이 문제에 직면한 사람을 위해 ULID 대신 UUID를 표시하는 데이터베이스도 있습니다. 이는 UUID/ULID를 서로 바꿔서 사용할 수 있으므로 Doctrine에서 예상되는 동작인 것 같습니다. 데이터베이스이지만 엔터티가 ULID에 매핑되어 있는 경우 데이터베이스에서 개체를 검색할 때 ULID가 있으므로 ULID 또는 UUID를 사용하여 동일한 개체를 검색할 수도 있습니다.
예를 들어 식별자에 ULID가 있는 사용자 엔터티가 있으므로 저장된 개체에는 다음과 같은 uuid가 있습니다.
으아아아해당 UUID를 사용하여 사용자를 검색하면 다음을 얻습니다.
으아아아이제 해당 ULID를 사용하여 사용자를 검색하면 작동합니다!
UUID를 검사하면 반환된 객체에 uuid가 베이스 32로 변환된 것을 볼 수 있습니다.
으아아아마지막으로 다음과 같이 refc4122로 변환하여 저장된 uuid를 얻을 수 있습니다.
으아아아Principle이 왜 ULID만 저장하지 않는지는 잘 모르겠지만, 현재 동작으로 인해 프로젝트에서 ULID를 사용하는 것이 방해되지는 않습니다. 도움이 되었기를 바랍니다!