Skip to content

Commit 021863c

Browse files
committed
fix: support StringConstraints metadata in SQLAlchemy type generation
1 parent 60c122d commit 021863c

2 files changed

Lines changed: 13 additions & 1 deletion

File tree

sqlmodel/_compat.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from pydantic import VERSION as P_VERSION
2121
from pydantic import BaseModel
2222
from pydantic import ConfigDict as ConfigDict
23+
from pydantic import StringConstraints as StringConstraints
2324
from pydantic._internal._fields import PydanticMetadata
2425
from pydantic._internal._model_construction import ModelMetaclass as ModelMetaclass
2526
from pydantic._internal._repr import Representation as Representation
@@ -200,7 +201,7 @@ def get_sa_type_from_field(field: Any) -> Any:
200201

201202
def get_field_metadata(field: Any) -> Any:
202203
for meta in field.metadata:
203-
if isinstance(meta, (PydanticMetadata, MaxLen)):
204+
if isinstance(meta, (PydanticMetadata, MaxLen, StringConstraints)):
204205
return meta
205206
return FakeMetadata()
206207

tests/test_main.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,3 +216,14 @@ class Hero(SQLModel, table=True):
216216
assert len(foreign_keys) == 1
217217
assert foreign_keys[0].ondelete == "CASCADE"
218218
assert team_id_column.nullable is False
219+
220+
221+
def test_string_constraints_max_length(clear_sqlmodel):
222+
from typing import Annotated
223+
from pydantic import StringConstraints
224+
225+
class Item(SQLModel, table=True):
226+
id: int | None = Field(default=None, primary_key=True)
227+
name: Annotated[str, StringConstraints(max_length=50)]
228+
229+
assert Item.__table__.c.name.type.length == 50

0 commit comments

Comments
 (0)