2024年10月08日(火) [長年日記]
■ [python] SQLModelのdatetimeに対する動作
どうしてそうなるのかは理解できていないが、事実をメモ。
SQLModel0.0.22を使っている。
datetime型のフィールドを持つモデルを定義して、そのmodel_validate_json()によりJSONからのでシリアライズを行ったときに次のようになる。
- table=True無しで定義したモデルはdatetime型のフィールドにdatetime型の値が格納される
- table=True有りで定義したモデルはdatetime型のフィールドにstr型の値が格納されてしまう
検証コードと実行結果を示す。
from datetime import datetime
from sqlmodel import Field, SQLModel
class A(SQLModel):
id: int = Field(primary_key=True)
dt: datetime
class B(SQLModel, table=True):
id: int = Field(primary_key=True)
dt: datetime
json = '{ "id": 1, "dt": "2024-01-02T03:45:06+09:00" }'
a = A.model_validate_json(json)
b = B.model_validate_json(json)
print(type(a.dt))
print(type(b.dt))
<class 'datetime.datetime'> <class 'str'>
(追記)
上記のようになるのは、データベースとして使用していたのがSQLiteで、SQLiteのdatetime型はtext型と同じだからのようだった。
[ツッコミを入れる]