From dc96203635107a6833b1e1ada1798e78d795382d Mon Sep 17 00:00:00 2001 From: Alexander Eisele Date: Thu, 15 May 2025 17:59:15 +0200 Subject: [PATCH 1/2] Add support for pydantic date types --- sqlmodel/main.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 38c85915aa..83493b118d 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -25,7 +25,16 @@ overload, ) -from pydantic import BaseModel, EmailStr +from pydantic import ( + AwareDatetime, + BaseModel, + EmailStr, + FutureDate, + FutureDatetime, + NaiveDatetime, + PastDate, + PastDatetime, +) from pydantic.fields import FieldInfo as PydanticFieldInfo from sqlalchemy import ( Boolean, @@ -680,14 +689,18 @@ def get_sqlalchemy_type(field: Any) -> Any: return Boolean if issubclass(type_, int): return Integer - if issubclass(type_, datetime): + if issubclass(type_, (datetime, FutureDatetime, PastDatetime)): return DateTime - if issubclass(type_, date): + if issubclass(type_, (date, FutureDate, PastDate)): return Date if issubclass(type_, timedelta): return Interval if issubclass(type_, time): return Time + if issubclass(type_, AwareDatetime): + return DateTime(timezone=True) + if issubclass(type_, NaiveDatetime): + return DateTime(timezone=False) if issubclass(type_, bytes): return LargeBinary if issubclass(type_, Decimal): From e8511efb03fd6ed67a73497e82e951476b2a5869 Mon Sep 17 00:00:00 2001 From: Alexander Eisele Date: Mon, 19 May 2025 11:14:45 +0200 Subject: [PATCH 2/2] Only check for Pydantic Types with Pydantic V2 --- sqlmodel/main.py | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 83493b118d..a80439e9ff 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -26,14 +26,8 @@ ) from pydantic import ( - AwareDatetime, BaseModel, EmailStr, - FutureDate, - FutureDatetime, - NaiveDatetime, - PastDate, - PastDatetime, ) from pydantic.fields import FieldInfo as PydanticFieldInfo from sqlalchemy import ( @@ -91,6 +85,16 @@ ) from .sql.sqltypes import AutoString +if IS_PYDANTIC_V2: + from pydantic import ( + AwareDatetime, + FutureDate, + FutureDatetime, + NaiveDatetime, + PastDate, + PastDatetime, + ) + if TYPE_CHECKING: from pydantic._internal._model_construction import ModelMetaclass as ModelMetaclass from pydantic._internal._repr import Representation as Representation @@ -689,18 +693,23 @@ def get_sqlalchemy_type(field: Any) -> Any: return Boolean if issubclass(type_, int): return Integer - if issubclass(type_, (datetime, FutureDatetime, PastDatetime)): + if issubclass(type_, datetime): return DateTime - if issubclass(type_, (date, FutureDate, PastDate)): + if issubclass(type_, date): return Date if issubclass(type_, timedelta): return Interval if issubclass(type_, time): return Time - if issubclass(type_, AwareDatetime): - return DateTime(timezone=True) - if issubclass(type_, NaiveDatetime): - return DateTime(timezone=False) + if IS_PYDANTIC_V2: + if issubclass(type_, (FutureDate, PastDate)): + return DateTime + if issubclass(type_, (FutureDatetime, PastDatetime)): + return DateTime + if issubclass(type_, AwareDatetime): + return DateTime(timezone=True) + if issubclass(type_, NaiveDatetime): + return DateTime(timezone=False) if issubclass(type_, bytes): return LargeBinary if issubclass(type_, Decimal):