ホームページ  >  に質問  >  本文

ULID がデータベースに UUID として誤って保存されました (バニラ symfony アプリケーション)

昨日、私は 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. composer プロジェクトを作成 symfony/sculpture:5.4.* shit
  2. cd 恥ずかしがり屋; コンポーザーには Web アプリが必要です
  3. Docker 構成をレシピに含めますか?はい (デフォルト)
  4. bin/console about
  5. Symfony バージョン 5.4.10 および PHP 7.4
  6. を表示します。 ORM
https://symfony.com/doc/5.4/doctrine.html からの抜粋:

composer には symfony/orm-pack が必要です
  1. composer には --dev symfony/maker-bundle が必要です
  2. docker-compose up -d
  3. エラー: ネットワークに割り当てられたデフォルトのアドレス プールに、重複しない利用可能な IPv4 アドレス プールが見つかりません。
そこで、docker-compose.override.yml ファイルにいくつかの行を追加しました。 リーリー

ホスト「10.1.2.3」の「.env」にDATABASE_URLを設定します

bin/console Doctrine:database:create
    (愚かですが、文書化されているとおり)
  1. default という名前の接続にデータベース「app」を作成できません クエリの実行中に例外が発生しました: SQLSTATE[42P04]: 重複データベース: 7 エラー: データベース "app" はすでに存在します
ええと、そうです。 Docker はすでにこれを行っています。

make:entity

は、ULID 機能ができるまで延期されます。

  1. ULID 私たちは https://symfony.com/doc/5.4/components/uid.html (特に ULID 部分) に傾いています:

composer には symfony/uid が必要です

#

    bin/console make:entity Product
  1. 「ulid」としての「someProperty」は null 許容ではありません
製品エンティティの確認追加のフィールド (主キー、整数) といくつかのゲッター/セッターがあることを除いて、ドキュメントとほぼ同じに見えます。
bin/コンソール make:migration

ULIDエンティティのテスト
    その間、テストを使用してデータベース エントリをプログラムで作成します:
    1. composer には phpunit が必要です データベース エントリをプログラムで作成する
    2. bin/コンソール --env=testism:移行:移行
    3. bin/コンソール --env=testism:database:create
    4. ファイル「tests/FooTest.php」には次のものが含まれます:
    リーリー
    1. bin/console --env=test ism:query:sql 'TRUNCATE Product' 念のため
    2. bin/phpunit
    3. bin/console --env=testism:query:sql 'SELECT * FROM product'

    ULID ではなく UUID を表示します。

    データベース内の UUID の代わりに ULID を表示します

    ULIDを主キーとして使用する

    まずクリーンアップしてから、https://symfony.com/doc/5.4/components/uid.html#ulids に示されている例を実行します。

    1. rm 移行/* 最初からやり直す
    2. bin/コンソール --env=testism:database:drop --force
    3. bin/コンソール --env=testism:database:create
    4. bin/console-ism:database:drop --force
    5. bin/コンソール --env=testism:database:create
    6. 「src/Entity/Product.php」を編集して、ドキュメントに 2 番目の ULID のみを含めます。例:
    リーリー

    (ドキュメントの例にはリポジトリ行がありません)

    1. bin/コンソール make:migration
    2. bin/コンソール --env=testism:移行:移行
    3. テストがより簡単になりました:
    リーリー
    1. bin/phpunit(リスクがあっても大丈夫)
    2. bin/console --env=testism:query:sql 'SELECT * FROM product'

    ULID の代わりに UUID を再度使用します

    データベースには ULID ではなく UUID が表示されます

P粉381463780P粉381463780332日前607

全員に返信(1)返信します

  • P粉377412096

    P粉3774120962023-12-17 00:06:49

    少し遅れましたが、この問題に直面している人のために、ULID の代わりに UUID を表示するデータベースもあります。これは、UUID/ULID を互換的に使用できるため、Doctrine では予期される動作であると思われます。つまり、UUID をデータベースに保存することもできます。ただし、エンティティは ULID にマップされており、データベースからオブジェクトを取得するときに ULID が得られます。ULID または UUID を使用して同じオブジェクトを取得することもできます。

    たとえば、識別子に ULID を持つユーザー エンティティがあるため、保存されるオブジェクトの uuid は次のようになります。

    リーリー

    その UUID を使用してユーザーを取得すると、次の結果が得られます:

    リーリー

    これで、その ULID を使用してユーザーを取得しても、同様に機能します。

    UUID を確認すると、返されたオブジェクトの UUID が Base 32 に変換されていることがわかります。 リーリー

    最後に、次のように refc4122 に変換することで、保存された uuid を取得できます。 リーリー

    Principle が ULID を保存するだけではない理由はわかりませんが、現在の動作ではプロジェクトで ULID を使用することが妨げられません。 お役に立てれば!

    返事
    0
  • キャンセル返事