Skip to content

Commit f067fc0

Browse files
committed
Alternative implementation: remove sa_column_fk_{args,kwargs}, allow the use to pass foreign_key=ForeignKey(...)
1 parent a6fd885 commit f067fc0

File tree

2 files changed

+14
-27
lines changed

2 files changed

+14
-27
lines changed

sqlmodel/main.py

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,6 @@ def __init__(self, default: Any = Undefined, **kwargs: Any) -> None:
121121
sa_column = kwargs.pop("sa_column", Undefined)
122122
sa_column_args = kwargs.pop("sa_column_args", Undefined)
123123
sa_column_kwargs = kwargs.pop("sa_column_kwargs", Undefined)
124-
sa_foreign_key_args = kwargs.pop("sa_foreign_key_args", Undefined)
125-
sa_foreign_key_kwargs = kwargs.pop("sa_foreign_key_kwargs", Undefined)
126124
if sa_column is not Undefined:
127125
if sa_column_args is not Undefined:
128126
raise RuntimeError(
@@ -165,6 +163,8 @@ def __init__(self, default: Any = Undefined, **kwargs: Any) -> None:
165163
if ondelete is not Undefined:
166164
if foreign_key is Undefined:
167165
raise RuntimeError("ondelete can only be used with foreign_key")
166+
if not isinstance(foreign_key, str):
167+
raise RuntimeError("ondelete can only be used with foreign_key given as a string")
168168
super().__init__(default=default, **kwargs)
169169
self.primary_key = primary_key
170170
self.nullable = nullable
@@ -176,8 +176,6 @@ def __init__(self, default: Any = Undefined, **kwargs: Any) -> None:
176176
self.sa_column = sa_column
177177
self.sa_column_args = sa_column_args
178178
self.sa_column_kwargs = sa_column_kwargs
179-
self.sa_foreign_key_args = sa_foreign_key_args
180-
self.sa_foreign_key_kwargs = sa_foreign_key_kwargs
181179

182180

183181
class RelationshipInfo(Representation):
@@ -252,8 +250,6 @@ def Field(
252250
sa_type: Union[Type[Any], UndefinedType] = Undefined,
253251
sa_column_args: Union[Sequence[Any], UndefinedType] = Undefined,
254252
sa_column_kwargs: Union[Mapping[str, Any], UndefinedType] = Undefined,
255-
sa_foreign_key_args: Union[Sequence[Any], UndefinedType] = Undefined,
256-
sa_foreign_key_kwargs: Union[Mapping[str, Any], UndefinedType] = Undefined,
257253
schema_extra: Optional[Dict[str, Any]] = None,
258254
) -> Any: ...
259255

@@ -390,8 +386,6 @@ def Field(
390386
sa_column: Union[Column, UndefinedType] = Undefined, # type: ignore
391387
sa_column_args: Union[Sequence[Any], UndefinedType] = Undefined,
392388
sa_column_kwargs: Union[Mapping[str, Any], UndefinedType] = Undefined,
393-
sa_foreign_key_args: Union[Sequence[Any], UndefinedType] = Undefined,
394-
sa_foreign_key_kwargs: Union[Mapping[str, Any], UndefinedType] = Undefined,
395389
schema_extra: Optional[Dict[str, Any]] = None,
396390
) -> Any:
397391
current_schema_extra = schema_extra or {}
@@ -430,8 +424,6 @@ def Field(
430424
sa_column=sa_column,
431425
sa_column_args=sa_column_args,
432426
sa_column_kwargs=sa_column_kwargs,
433-
sa_foreign_key_args=sa_foreign_key_args,
434-
sa_foreign_key_kwargs=sa_foreign_key_kwargs,
435427
**current_schema_extra,
436428
)
437429
post_init_field_info(field_info)
@@ -740,22 +732,18 @@ def get_column_from_field(field: Any) -> Column: # type: ignore
740732
if unique is Undefined:
741733
unique = False
742734
if foreign_key:
743-
if field_info.ondelete == "SET NULL" and not nullable:
744-
raise RuntimeError('ondelete="SET NULL" requires nullable=True')
745-
assert isinstance(foreign_key, str)
746-
fk_args = []
747-
fk_kwargs = {}
748-
ondelete = getattr(field_info, "ondelete", Undefined)
749-
if ondelete is not Undefined:
735+
if isinstance(foreign_key, str):
736+
if field_info.ondelete == "SET NULL" and not nullable:
737+
raise RuntimeError('ondelete="SET NULL" requires nullable=True')
738+
assert isinstance(foreign_key, str)
739+
ondelete = getattr(field_info, "ondelete", Undefined)
740+
if ondelete is Undefined:
741+
ondelete = None
750742
assert isinstance(ondelete, (str, type(None)))
751-
fk_kwargs["ondelete"] = ondelete
752-
sa_foreign_key_args = getattr(field_info, "sa_foreign_key_args", Undefined)
753-
if sa_foreign_key_args is not Undefined:
754-
fk_args.extend(cast(Sequence[Any], sa_foreign_key_args))
755-
sa_foreign_key_kwargs = getattr(field_info, "sa_foreign_key_kwargs", Undefined)
756-
if sa_foreign_key_kwargs is not Undefined:
757-
fk_kwargs.update(cast(Dict[Any, Any], sa_foreign_key_kwargs))
758-
args.append(ForeignKey(foreign_key, *fk_args, **fk_kwargs))
743+
args.append(ForeignKey(foreign_key, ondelete=ondelete))
744+
else:
745+
assert isinstance(foreign_key, ForeignKey)
746+
args.append(foreign_key.copy())
759747
kwargs = {
760748
"primary_key": primary_key,
761749
"nullable": nullable,

tests/test_field_sa_fk_args_kwargs.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,7 @@ class User(SQLModel, table=True):
5252
class Base(SQLModel):
5353
owner_id: Optional[int] = Field(
5454
default=None,
55-
foreign_key="user.id",
56-
sa_foreign_key_kwargs={"ondelete": "SET NULL"},
55+
foreign_key=ForeignKey("user.id", ondelete="SET NULL"),
5756
)
5857

5958
class Asset(Base, table=True):

0 commit comments

Comments
 (0)