From 1c5263e6e4895f5ea44e274a7d371beb887f3890 Mon Sep 17 00:00:00 2001 From: Arun Sharma Date: Thu, 16 Jan 2025 17:25:38 -0800 Subject: [PATCH 01/11] Support sqlmodel_rebuild, similar to pydantic --- sqlmodel/main.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 3532e81a8e..cf65f8b572 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -585,9 +585,17 @@ def get_config(name: str) -> Any: setattr(new_cls, "__abstract__", True) # noqa: B010 return new_cls - # Override SQLAlchemy, allow both SQLAlchemy and plain Pydantic models def __init__( cls, classname: str, bases: Tuple[type, ...], dict_: Dict[str, Any], **kw: Any + ) -> None: + return cls.__do_init__(bases, dict_, kw) + + def sqlmodel_rebuild(cls) -> None: + return cls.__do_init__(cls.__bases__, cls.__dict__, {}) + + # Override SQLAlchemy, allow both SQLAlchemy and plain Pydantic models + def __do_init__( + cls, classname: str, bases: Tuple[type, ...], dict_: Dict[str, Any], **kw: Any ) -> None: # Only one of the base classes (or the current one) should be a table model # this allows FastAPI cloning a SQLModel for the response_model without From 80f29355727a2815fffd84fb292fc0e821d24a2b Mon Sep 17 00:00:00 2001 From: Arun Sharma Date: Thu, 16 Jan 2025 20:53:55 -0800 Subject: [PATCH 02/11] registry: unregister the manager and class --- sqlmodel/main.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index cf65f8b572..d03fe7b2e4 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -591,6 +591,14 @@ def __init__( return cls.__do_init__(bases, dict_, kw) def sqlmodel_rebuild(cls) -> None: + reg = cls._sa_registry + # clear any exisiting mappers for the cls + manager = [m for m in reg._managers if m.class_ == cls] + if len(manager) > 0: + for m in manager: + reg._dispose_manager_and_mapper(m) + del reg._managers[m] + return cls.__do_init__(cls.__bases__, cls.__dict__, {}) # Override SQLAlchemy, allow both SQLAlchemy and plain Pydantic models From cb12bdaaa412e85a55e11b3c26dd3e0377b9e272 Mon Sep 17 00:00:00 2001 From: Arun Sharma Date: Thu, 16 Jan 2025 21:04:11 -0800 Subject: [PATCH 03/11] code cleanup --- sqlmodel/main.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index d03fe7b2e4..444328d7a1 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -593,10 +593,9 @@ def __init__( def sqlmodel_rebuild(cls) -> None: reg = cls._sa_registry # clear any exisiting mappers for the cls - manager = [m for m in reg._managers if m.class_ == cls] - if len(manager) > 0: - for m in manager: - reg._dispose_manager_and_mapper(m) + managers = [m for m in reg._managers if m.class_ == cls] + for m in managers: + reg._dispose_manager_and_mapper(m) del reg._managers[m] return cls.__do_init__(cls.__bases__, cls.__dict__, {}) From 83629f6db9db239f68ae8068a40de3b30e9e8888 Mon Sep 17 00:00:00 2001 From: adsharma <658691+adsharma@users.noreply.github.com> Date: Wed, 26 Feb 2025 13:00:54 -0800 Subject: [PATCH 04/11] Suppress type errors Linter doesn't understand the special call handling for this case. --- sqlmodel/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 444328d7a1..6c9771b0dd 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -588,7 +588,7 @@ def get_config(name: str) -> Any: def __init__( cls, classname: str, bases: Tuple[type, ...], dict_: Dict[str, Any], **kw: Any ) -> None: - return cls.__do_init__(bases, dict_, kw) + return cls.__do_init__(bases, dict_, kw) # type: ignore def sqlmodel_rebuild(cls) -> None: reg = cls._sa_registry @@ -598,7 +598,7 @@ def sqlmodel_rebuild(cls) -> None: reg._dispose_manager_and_mapper(m) del reg._managers[m] - return cls.__do_init__(cls.__bases__, cls.__dict__, {}) + return cls.__do_init__(cls.__bases__, cls.__dict__, {}) # type: ignore # Override SQLAlchemy, allow both SQLAlchemy and plain Pydantic models def __do_init__( From be1202a7f9634a540d2bed60339182d61204da73 Mon Sep 17 00:00:00 2001 From: Arun Sharma Date: Fri, 28 Feb 2025 10:03:28 -0800 Subject: [PATCH 05/11] Temporarily revert changes to verify that the tests pass --- sqlmodel/main.py | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 022bde5b91..6ffab76f26 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -585,23 +585,9 @@ def get_config(name: str) -> Any: setattr(new_cls, "__abstract__", True) # noqa: B010 return new_cls - def __init__( - cls, classname: str, bases: Tuple[type, ...], dict_: Dict[str, Any], **kw: Any - ) -> None: - return cls.__do_init__(bases, dict_, kw) # type: ignore - - def sqlmodel_rebuild(cls) -> None: - reg = cls._sa_registry - # clear any exisiting mappers for the cls - managers = [m for m in reg._managers if m.class_ == cls] - for m in managers: - reg._dispose_manager_and_mapper(m) - del reg._managers[m] - - return cls.__do_init__(cls.__bases__, cls.__dict__, {}) # type: ignore - + # Temporarily revert changes to verify that the tests pass # Override SQLAlchemy, allow both SQLAlchemy and plain Pydantic models - def __do_init__( + def __init__( cls, classname: str, bases: Tuple[type, ...], dict_: Dict[str, Any], **kw: Any ) -> None: # Only one of the base classes (or the current one) should be a table model From 83bea226443fd5893f8a78de15dcd09472941d72 Mon Sep 17 00:00:00 2001 From: Arun Sharma Date: Fri, 28 Feb 2025 10:06:36 -0800 Subject: [PATCH 06/11] Revert "Temporarily revert changes to verify that the tests pass" This reverts commit be1202a7f9634a540d2bed60339182d61204da73. --- sqlmodel/main.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 6ffab76f26..022bde5b91 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -585,10 +585,24 @@ def get_config(name: str) -> Any: setattr(new_cls, "__abstract__", True) # noqa: B010 return new_cls - # Temporarily revert changes to verify that the tests pass - # Override SQLAlchemy, allow both SQLAlchemy and plain Pydantic models def __init__( cls, classname: str, bases: Tuple[type, ...], dict_: Dict[str, Any], **kw: Any + ) -> None: + return cls.__do_init__(bases, dict_, kw) # type: ignore + + def sqlmodel_rebuild(cls) -> None: + reg = cls._sa_registry + # clear any exisiting mappers for the cls + managers = [m for m in reg._managers if m.class_ == cls] + for m in managers: + reg._dispose_manager_and_mapper(m) + del reg._managers[m] + + return cls.__do_init__(cls.__bases__, cls.__dict__, {}) # type: ignore + + # Override SQLAlchemy, allow both SQLAlchemy and plain Pydantic models + def __do_init__( + cls, classname: str, bases: Tuple[type, ...], dict_: Dict[str, Any], **kw: Any ) -> None: # Only one of the base classes (or the current one) should be a table model # this allows FastAPI cloning a SQLModel for the response_model without From fc210a3b8ab934908ea0f133157b01d7fb63829f Mon Sep 17 00:00:00 2001 From: Arun Sharma Date: Fri, 28 Feb 2025 20:25:30 -0800 Subject: [PATCH 07/11] Fix the error in passing kwargs --- sqlmodel/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 022bde5b91..8da6cfe65a 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -588,7 +588,7 @@ def get_config(name: str) -> Any: def __init__( cls, classname: str, bases: Tuple[type, ...], dict_: Dict[str, Any], **kw: Any ) -> None: - return cls.__do_init__(bases, dict_, kw) # type: ignore + return cls.__do_init__(classname, bases, dict_, **kw) def sqlmodel_rebuild(cls) -> None: reg = cls._sa_registry @@ -598,7 +598,7 @@ def sqlmodel_rebuild(cls) -> None: reg._dispose_manager_and_mapper(m) del reg._managers[m] - return cls.__do_init__(cls.__bases__, cls.__dict__, {}) # type: ignore + return cls.__do_init__(cls.name, cls.__bases__, cls.__dict__) # Override SQLAlchemy, allow both SQLAlchemy and plain Pydantic models def __do_init__( From d1ad4ceb1f3982a7fcaba273b67f6f76b793dfee Mon Sep 17 00:00:00 2001 From: Arun Sharma Date: Fri, 28 Feb 2025 20:30:50 -0800 Subject: [PATCH 08/11] Try to fix mypy --- sqlmodel/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 8da6cfe65a..c276fe4ac2 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -598,11 +598,11 @@ def sqlmodel_rebuild(cls) -> None: reg._dispose_manager_and_mapper(m) del reg._managers[m] - return cls.__do_init__(cls.name, cls.__bases__, cls.__dict__) + return cls.__do_init__(cls.__name__, cls.__bases__, cls.__dict__) # Override SQLAlchemy, allow both SQLAlchemy and plain Pydantic models def __do_init__( - cls, classname: str, bases: Tuple[type, ...], dict_: Dict[str, Any], **kw: Any + cls, classname: str, bases: Tuple[type, ...], dict_: Mapping[str, Any], **kw: Any ) -> None: # Only one of the base classes (or the current one) should be a table model # this allows FastAPI cloning a SQLModel for the response_model without From 66297ee5db653f0b1b44dcd2f5645ebf6311ad86 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 1 Mar 2025 04:31:01 +0000 Subject: [PATCH 09/11] =?UTF-8?q?=F0=9F=8E=A8=20[pre-commit.ci]=20Auto=20f?= =?UTF-8?q?ormat=20from=20pre-commit.com=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sqlmodel/main.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index c276fe4ac2..ef35f3e88e 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -602,7 +602,11 @@ def sqlmodel_rebuild(cls) -> None: # Override SQLAlchemy, allow both SQLAlchemy and plain Pydantic models def __do_init__( - cls, classname: str, bases: Tuple[type, ...], dict_: Mapping[str, Any], **kw: Any + cls, + classname: str, + bases: Tuple[type, ...], + dict_: Mapping[str, Any], + **kw: Any, ) -> None: # Only one of the base classes (or the current one) should be a table model # this allows FastAPI cloning a SQLModel for the response_model without From 9de3d86af687e855e5ef8613c47bfda172e975d7 Mon Sep 17 00:00:00 2001 From: Arun Sharma Date: Fri, 28 Feb 2025 20:35:02 -0800 Subject: [PATCH 10/11] keep Dict for now, but use type:ignore to silence --- sqlmodel/main.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index ef35f3e88e..d40e087441 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -598,15 +598,11 @@ def sqlmodel_rebuild(cls) -> None: reg._dispose_manager_and_mapper(m) del reg._managers[m] - return cls.__do_init__(cls.__name__, cls.__bases__, cls.__dict__) + return cls.__do_init__(cls.__name__, cls.__bases__, cls.__dict__) # type: ignore (Dict vs Mapping) # Override SQLAlchemy, allow both SQLAlchemy and plain Pydantic models def __do_init__( - cls, - classname: str, - bases: Tuple[type, ...], - dict_: Mapping[str, Any], - **kw: Any, + cls, classname: str, bases: Tuple[type, ...], dict_: Dict[str, Any], **kw: Any ) -> None: # Only one of the base classes (or the current one) should be a table model # this allows FastAPI cloning a SQLModel for the response_model without From 0b279c0ffe44c3be23d929dd1daec9ed8badbc00 Mon Sep 17 00:00:00 2001 From: Arun Sharma Date: Fri, 28 Feb 2025 20:42:17 -0800 Subject: [PATCH 11/11] type: ignore syntax --- sqlmodel/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index d40e087441..9f633ab7f4 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -598,7 +598,7 @@ def sqlmodel_rebuild(cls) -> None: reg._dispose_manager_and_mapper(m) del reg._managers[m] - return cls.__do_init__(cls.__name__, cls.__bases__, cls.__dict__) # type: ignore (Dict vs Mapping) + return cls.__do_init__(cls.__name__, cls.__bases__, cls.__dict__) # type: ignore # Dict vs Mapping # Override SQLAlchemy, allow both SQLAlchemy and plain Pydantic models def __do_init__(