From 277e4d6111952a3e00838a9b72435b506ec67bf6 Mon Sep 17 00:00:00 2001 From: Malthe Karbo Date: Thu, 24 Feb 2022 11:10:40 +0100 Subject: [PATCH 1/3] Add foreign_key name to wrapper --- sqlmodel/main.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 4d6d2f2712..5b9a046319 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -294,7 +294,7 @@ def get_config(name: str) -> Any: # If it was passed by kwargs, ensure it's also set in config new_cls.__config__.table = config_table for k, v in new_cls.__fields__.items(): - col = get_column_from_field(v) + col = get_column_from_field(v, cls=new_cls) setattr(new_cls, k, col) # Set a config flag to tell FastAPI that this should be read with a field # in orm_mode instead of preemptively converting it to a dict. @@ -330,7 +330,7 @@ def __init__( if getattr(cls.__config__, "table", False) and not base_is_table: dict_used = dict_.copy() for field_name, field_value in cls.__fields__.items(): - dict_used[field_name] = get_column_from_field(field_value) + dict_used[field_name] = get_column_from_field(field_value, cls=cls) for rel_name, rel_info in cls.__sqlmodel_relationships__.items(): if rel_info.sa_relationship: # There's a SQLAlchemy relationship declared, that takes precedence @@ -416,7 +416,12 @@ def get_sqlachemy_type(field: ModelField) -> Any: return GUID -def get_column_from_field(field: ModelField) -> Column: # type: ignore +_TSQLModel = TypeVar("_TSQLModel", bound="SQLModel") + + +def get_column_from_field( + field: ModelField, cls: Union[_TSQLModel, SQLModelMetaclass] +) -> Column: # type: ignore sa_column = getattr(field.field_info, "sa_column", Undefined) if isinstance(sa_column, Column): return sa_column @@ -433,7 +438,12 @@ def get_column_from_field(field: ModelField) -> Column: # type: ignore args = [] foreign_key = getattr(field.field_info, "foreign_key", None) if foreign_key: - args.append(ForeignKey(foreign_key)) + tablename = getattr(cls, "__tablename__", None) + if tablename is not None: + fk_name = f"{field.name}_{tablename}_fkey" + args.append(ForeignKey(foreign_key, name=fk_name)) + else: + args.append(ForeignKey(foreign_key)) kwargs = { "primary_key": primary_key, "nullable": nullable, @@ -466,9 +476,6 @@ def _value_items_is_true(v: Any) -> bool: return v is True or v is ... -_TSQLModel = TypeVar("_TSQLModel", bound="SQLModel") - - class SQLModel(BaseModel, metaclass=SQLModelMetaclass, registry=default_registry): # SQLAlchemy needs to set weakref(s), Pydantic will set the other slots values __slots__ = ("__weakref__",) From a732926e58b0145f0e2c2b16e4ff292082198cf2 Mon Sep 17 00:00:00 2001 From: Malthe Karbo Date: Thu, 24 Feb 2022 11:37:24 +0100 Subject: [PATCH 2/3] Swap table and field name --- sqlmodel/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 5b9a046319..c4b79d2c26 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -440,7 +440,7 @@ def get_column_from_field( if foreign_key: tablename = getattr(cls, "__tablename__", None) if tablename is not None: - fk_name = f"{field.name}_{tablename}_fkey" + fk_name = f"{tablename}_{field.name}_fkey" args.append(ForeignKey(foreign_key, name=fk_name)) else: args.append(ForeignKey(foreign_key)) From cc9350079924872291fab286d244d7e685c67a12 Mon Sep 17 00:00:00 2001 From: Malthe Karbo Date: Sat, 4 Jun 2022 21:11:41 +0200 Subject: [PATCH 3/3] Add fix #322: sqlalchemy 1.4.36 breaks sqlmodel --- sqlmodel/main.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index c4b79d2c26..e971566e23 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -369,6 +369,8 @@ def __init__( relationship_to, *rel_args, **rel_kwargs ) dict_used[rel_name] = rel_value + # From https://github.com/tiangolo/sqlmodel/pull/322 + setattr(cls, rel_name, rel_value) # Fix #315 DeclarativeMeta.__init__(cls, classname, bases, dict_used, **kw) else: ModelMetaclass.__init__(cls, classname, bases, dict_, **kw)