From 1d43bd8b1e26b14b541f77feda0f606916df9699 Mon Sep 17 00:00:00 2001 From: Esteban Maya Date: Mon, 3 Jun 2024 21:47:40 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Fix=20pydantic=20`EmailStr`=20su?= =?UTF-8?q?pport=20and=20`max=5Flength`=20in=20several=20String=20subclass?= =?UTF-8?q?es=20(#966)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sqlmodel/main.py | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index a16428b..40051a5 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -25,7 +25,7 @@ from typing import ( overload, ) -from pydantic import BaseModel +from pydantic import BaseModel, EmailStr from pydantic.fields import FieldInfo as PydanticFieldInfo from sqlalchemy import ( Boolean, @@ -574,7 +574,18 @@ def get_sqlalchemy_type(field: Any) -> Any: # Check enums first as an enum can also be a str, needed by Pydantic/FastAPI if issubclass(type_, Enum): return sa_Enum(type_) - if issubclass(type_, str): + if issubclass( + type_, + ( + str, + ipaddress.IPv4Address, + ipaddress.IPv4Network, + ipaddress.IPv6Address, + ipaddress.IPv6Network, + Path, + EmailStr, + ), + ): max_length = getattr(metadata, "max_length", None) if max_length: return AutoString(length=max_length) @@ -600,16 +611,6 @@ def get_sqlalchemy_type(field: Any) -> Any: precision=getattr(metadata, "max_digits", None), scale=getattr(metadata, "decimal_places", None), ) - if issubclass(type_, ipaddress.IPv4Address): - return AutoString - if issubclass(type_, ipaddress.IPv4Network): - return AutoString - if issubclass(type_, ipaddress.IPv6Address): - return AutoString - if issubclass(type_, ipaddress.IPv6Network): - return AutoString - if issubclass(type_, Path): - return AutoString if issubclass(type_, uuid.UUID): return GUID raise ValueError(f"{type_} has no matching SQLAlchemy type")