diff --git a/sqlmodel/_compat.py b/sqlmodel/_compat.py index a220b193f1..9ffcf28080 100644 --- a/sqlmodel/_compat.py +++ b/sqlmodel/_compat.py @@ -20,6 +20,7 @@ from pydantic import VERSION as P_VERSION from pydantic import BaseModel from pydantic import ConfigDict as ConfigDict +from pydantic import StringConstraints as StringConstraints from pydantic._internal._fields import PydanticMetadata from pydantic._internal._model_construction import ModelMetaclass as ModelMetaclass from pydantic._internal._repr import Representation as Representation @@ -200,7 +201,7 @@ def get_sa_type_from_field(field: Any) -> Any: def get_field_metadata(field: Any) -> Any: for meta in field.metadata: - if isinstance(meta, (PydanticMetadata, MaxLen)): + if isinstance(meta, (PydanticMetadata, MaxLen, StringConstraints)): return meta return FakeMetadata() diff --git a/tests/test_main.py b/tests/test_main.py index fa40b71853..b024c2d747 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -216,3 +216,15 @@ class Hero(SQLModel, table=True): assert len(foreign_keys) == 1 assert foreign_keys[0].ondelete == "CASCADE" assert team_id_column.nullable is False + + +def test_string_constraints_max_length(clear_sqlmodel): + from typing import Annotated + + from pydantic import StringConstraints + + class Item(SQLModel, table=True): + id: int | None = Field(default=None, primary_key=True) + name: Annotated[str, StringConstraints(max_length=50)] + + assert Item.__table__.c.name.type.length == 50