From 0b27188f8cbef075b02105fcb8f267c132ac9849 Mon Sep 17 00:00:00 2001 From: DYNOSuprovo Date: Fri, 11 Sep 2026 18:05:56 +0530 Subject: [PATCH] fix(typing): export SQLModelConfig and allow ConfigDict for model_config (#2091) Signed-off-by: DYNOSuprovo --- sqlmodel/__init__.py | 2 + sqlmodel/main.py | 7 ++- tests/test_pydantic/test_model_config.py | 59 ++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 tests/test_pydantic/test_model_config.py diff --git a/sqlmodel/__init__.py b/sqlmodel/__init__.py index 4290e65719..d2d84018b8 100644 --- a/sqlmodel/__init__.py +++ b/sqlmodel/__init__.py @@ -1,6 +1,7 @@ __version__ = "0.0.42" # Re-export from Pydantic +from pydantic import ConfigDict as ConfigDict from pydantic import Discriminator as Discriminator from pydantic import Tag as Tag @@ -121,6 +122,7 @@ from .main import Field as Field from .main import Relationship as Relationship from .main import SQLModel as SQLModel +from .main import SQLModelConfig as SQLModelConfig from .orm.session import Session as Session from .sql.expression import all_ as all_ from .sql.expression import and_ as and_ diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 40fe64e423..e7c3f8cc8f 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -56,9 +56,9 @@ from ._compat import ( PYDANTIC_MINOR_VERSION, BaseConfig, + ConfigDict, ModelMetaclass, Representation, - SQLModelConfig, Undefined, UndefinedType, finish_init, @@ -73,6 +73,9 @@ sqlmodel_init, sqlmodel_validate, ) +from ._compat import ( + SQLModelConfig as SQLModelConfig, +) from .sql.sqltypes import AutoString if TYPE_CHECKING: @@ -561,7 +564,7 @@ def Relationship( @__dataclass_transform__(kw_only_default=True, field_descriptors=(Field, FieldInfo)) class SQLModelMetaclass(ModelMetaclass, DeclarativeMeta): __sqlmodel_relationships__: dict[str, RelationshipInfo] - model_config: SQLModelConfig + model_config: SQLModelConfig | ConfigDict | dict[str, Any] model_fields: ClassVar[dict[str, FieldInfo]] # Replicate SQLAlchemy diff --git a/tests/test_pydantic/test_model_config.py b/tests/test_pydantic/test_model_config.py new file mode 100644 index 0000000000..d0a8e9af42 --- /dev/null +++ b/tests/test_pydantic/test_model_config.py @@ -0,0 +1,59 @@ +from pydantic import ConfigDict as PydanticConfigDict +from sqlmodel import ConfigDict, Field, SQLModel, SQLModelConfig + + +def test_sqlmodel_config_export(): + import sqlmodel + import sqlmodel.main + + assert hasattr(sqlmodel, "SQLModelConfig") + assert hasattr(sqlmodel.main, "SQLModelConfig") + assert hasattr(sqlmodel, "ConfigDict") + assert sqlmodel.SQLModelConfig is SQLModelConfig + assert sqlmodel.ConfigDict is ConfigDict + + +def test_model_with_sqlmodel_config(): + class Item(SQLModel): + id: int + name: str + model_config = SQLModelConfig(from_attributes=True) + + assert Item.model_config.get("from_attributes") is True + + +def test_model_with_sqlmodel_reexported_config_dict(): + class Item(SQLModel): + id: int + name: str + model_config = ConfigDict(from_attributes=True) + + assert Item.model_config.get("from_attributes") is True + + +def test_model_with_pydantic_config_dict(): + class Item(SQLModel): + id: int + name: str + model_config = PydanticConfigDict(from_attributes=True) + + assert Item.model_config.get("from_attributes") is True + + +def test_model_with_plain_dict_config(): + class Item(SQLModel): + id: int + name: str + model_config = {"from_attributes": True} + + assert Item.model_config.get("from_attributes") is True + + +def test_table_model_with_sqlmodel_config(): + class Hero(SQLModel, table=True): + id: int | None = Field(default=None, primary_key=True) + name: str + model_config = SQLModelConfig(extra="ignore") + + assert Hero.model_config.get("extra") == "ignore" + assert Hero.model_config.get("table") is True