diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 38c85915aa..a80439e9ff 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -25,7 +25,10 @@ overload, ) -from pydantic import BaseModel, EmailStr +from pydantic import ( + BaseModel, + EmailStr, +) from pydantic.fields import FieldInfo as PydanticFieldInfo from sqlalchemy import ( Boolean, @@ -82,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 @@ -688,6 +701,15 @@ def get_sqlalchemy_type(field: Any) -> Any: return Interval if issubclass(type_, time): return Time + 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):