Python ULID pydantic Python で ULID を使う Python で ULID を使う備忘録。
ULID とは ULID は、UUID のような一意な ID を生成するための仕様/規格。ULID は次の特徴を持つ。
引用
- 128-bit compatible with UUID
- 1.21e+24 unique ULIDs per millisecond
- Lexicographically sortable!
- Canonically encoded as a 26 character string, as opposed to the 36 character UUID
- Uses Crockford’s base32 for better efficiency and readability (5 bits per character)
- Case insensitive
- No special characters (URL safe)
Python で ULID を使う Python で ULID を使うにはpython-ulid
パッケージを使う。
$ pip install python-ulid
引数なしで ULID を生成したり、文字列・時間から ULID を生成できる。
>>> from ulid import ULID
>>> ULID ()
ULID ( 01E75 HZVW36EAZKMF1W7XNMSB4 )
>>> import time , datetime
>>> ULID . from_timestamp ( time . time ())
ULID ( 01E75 J1MKKWMGG0N5MBHFMRC84 )
>>> ULID . from_datetime ( datetime . datetime . now ())
ULID ( 01E75 J2XBK390V2XRH44EHC10X )
>>> str ( ulid )
'01BTGNYV6HRNK8K8VKZASZCFPE'
>>> ulid . hex
'015ea15f6cd1c56689a373fab3f63ece'
>>> int ( ulid )
1820576928786795198723644692628913870
>>> bytes ( ulid )
b ' \x01 ^ \xa1 _l \xd1\xc5 f \x89\xa3 s \xfa\xb3\xf6 > \xce '
>>> ulid . timestamp
1505945939.153
>>> ulid . datetime
datetime . datetime ( 2017 , 9 , 20 , 22 , 18 , 59 , 153000 , tzinfo = datetime . timezone . utc )
UUID との相互変換 ULID と UUID は相互変換が可能。
>>> from uuid import uuid4
>>> ULID . from_uuid ( uuid4 ())
ULID ( 27 Q506DP7E9YNRXA0XVD8Z5YSG )
>>> ulid . to_uuid ()
UUID ( '015ea15f-6cd1-c566-89a3-73fab3f63ece' )
pydantic と組み合わせて使う pydantic と組み合わせて使うと、データモデルに ULID を使うことができる。
from pydantic import BaseModel
from ulid import ULID
class Model ( BaseModel ):
ulid : ULID
model = Model ( ulid = "DX89370400440532013000" ) # OK
model = Model ( ulid = "not-a-ulid" ) # Raises ValidationError
2024-11-02 23:14:48 2022-09-16 18:36:58