From 021863cba1d3a9ff6259cd2fbc25120da79b46db Mon Sep 17 00:00:00 2001 From: Sujit-1509 Date: Wed, 10 Jun 2026 17:48:09 +0530 Subject: [PATCH 1/2] fix: support StringConstraints metadata in SQLAlchemy type generation --- sqlmodel/_compat.py | 3 ++- tests/test_main.py | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) 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..0c8b8e22c5 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -216,3 +216,14 @@ 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 From 8509853145471d75b7b71cc619953567b093adeb Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 12:19:13 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=8E=A8=20Auto=20format?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_main.py b/tests/test_main.py index 0c8b8e22c5..b024c2d747 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -220,6 +220,7 @@ class Hero(SQLModel, table=True): def test_string_constraints_max_length(clear_sqlmodel): from typing import Annotated + from pydantic import StringConstraints class Item(SQLModel, table=True):