目的
タイトルの通り
環境
python = 3.11.2
Django = 4.1.7
django-ulid = 0.0.4
PostgreSQL15
UUIDではなくULIDって??
ULID(Universally Unique Lexicographically Sortable Identifier)とはランダムなIDで、UUIDと同様に一意性が保証されていますが、その中でもデータベースで生成時刻のミリ秒単位で時系列ソートが可能なことが特徴です。
以下で詳しく説明されています!
-
ソートできるユニークな ID を ULID で採番する
ただし、PostgreSQLを使用する場合、ULIDをサポートしていないため、Django側で生成する必要があります。
早速実装してみよう
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を生成できるだけであって、テーブルのレコードに自動生成できるというわけではありません。。。