2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Django] ちょ〜っとだけ時間ください!!Primary KeyのIDをULIDとして設定してみませんか??

Last updated at Posted at 2023-03-19

目的

タイトルの通り

環境

python = 3.11.2
Django = 4.1.7
django-ulid = 0.0.4
PostgreSQL15

UUIDではなくULIDって??

ULID(Universally Unique Lexicographically Sortable Identifier)とはランダムなIDで、UUIDと同様に一意性が保証されていますが、その中でもデータベースで生成時刻のミリ秒単位で時系列ソートが可能なことが特徴です。
以下で詳しく説明されています!

早速実装してみよう

django-ulidをインストールします。

pip install django-ulid

models.pyに以下のコードを追加します。

from django.db import models
from django_ulid.models import default, ulid


class Customer(models.Model):
    id = models.CharField(
        max_length=26, primary_key=True, default=ulid.new, editable=False
    )
    name = models.CharField(max_length=50, verbose_name="名前")

DjangoもPostgreSQLもULIDをサポートしていません。
ですので、django-ulidをインストールしてCharFieldの中でULIDを自動生成するようにします。
idフィールドにはCharFieldを使用し、max_lengthを26に設定します。ULIDは26文字の文字列で構成されているからです。
また、defaultにはulid.newを設定し、editableをFalseに設定します。これにより、idフィールドを手動で変更できないようにします。

補足

ULIDはランダムなIDを生成するため、作成された順序が予測できないため、idを使用した検索が遅くなる可能性があります。
また、ULIDの一意性は時間ベースのUUIDと比較すると高速ですが、完全に一意なものではありません。
そのため、IDの一意性が絶対に絶対に重要な場合は、UUIDを使用することをお勧めします(基本被ることはないらしいですが)。

ちなみに

以下のPostgreSQLの拡張機能もありましたが、これはただ単にDBにログインして関数を呼ぶことでULIDを生成できるだけであって、テーブルのレコードに自動生成できるというわけではありません。。。

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?