Repository navigation
SQLAlchemy version 1.4.36 breaks SQLModel relationships #315
Description
First Check
- I added a very descriptive title to this issue.
- I used the GitHub search to find a similar issue and didn't find it.
- I searched the SQLModel documentation, with the integrated search.
- I already searched in Google "How to X in SQLModel" and didn't find any information.
- I already read and followed all the tutorial in the docs and didn't find an answer.
- I already checked if it is not related to SQLModel but to Pydantic.
- I already checked if it is not related to SQLModel but to SQLAlchemy.
👆 Not quite true - this is definitely related to SQLAlchemy!
Commit to Help
- I commit to help with one of those options 👆
Example Code
from typing import Optional
from sqlmodel import Field, Relationship, SQLModel
class City(SQLModel, table=True):
name: str = Field(primary_key=True)
heroes: "Hero" = Relationship(back_populates="city")
class Hero(SQLModel, table=True):
name: str = Field(primary_key=True)
city_name: Optional[str] = Field(default=None,foreign_key="city.name")
city: Optional[City] = Relationship(back_populates="heroes",
sa_relationship_kwargs=dict(cascade="all,delete")
)
if __name__ == "__main__":
gotham = City(name="Gotham")
batman = Hero(name="Batman", city=gotham)
assert batman.name == 'Batman' # This is fine
assert batman.city == gotham # This now breaksDescription
Our CI suddenly started failing, despite local SQLModel working fine. The issues turns out to be the transitive dependency on SQLAlchemy, which is weakly pinned: Github Actions pulled the latest version (1.4.36) and most of our tests started failing.
https://github.com/sqlalchemy/sqlalchemy/releases/tag/rel_1_4_36
The problem seems to be related to how relationships are defined, but I haven't yet dug into the SQLAlchemy changes enough to understand why that is.
I'm opening this issue chiefly to help anybody else who is confused by why suddenly their tests are failing. I'm happy to help fix it if it's affecting others too.
For the time being we have just pinned SQLAlchemy==1.4.34 in our requirements.txt.
Operating System
Linux, macOS
Operating System Details
Replicated locally and on Github Actions, both running in Docker
SQLModel Version
0.0.6
Python Version
3.9.10
Additional Context
We were previously running SQLAlchemy 1.4.34 locally and that works fine. Pinning to 1.4.36 breaks SQLModel.
Activity
antont commentedon Apr 27, 2022
We pinned to 1.4.35, in our fork of sqlmodel. Happened to have that locally as upgraded recently and hadn't had problems. Ran into this same this afternoon. Thanks for reporting!
JLHasson commentedon Apr 27, 2022
Same issue here, pinning to 1.4.35 resolved
Pin SQLAlchemy to prevent bug fastapi/sqlmodel#315
byrman commentedon Apr 28, 2022
It seems related to this recent change:
https://github.com/sqlalchemy/sqlalchemy/blob/main/lib/sqlalchemy/orm/decl_api.py#L114
jossefaz commentedon Apr 28, 2022
As @byrman wrote, the change of DeclarativeMeta seems to be the breaking change here.
byrman commentedon Apr 28, 2022
Not sure if this is a sustainable fix, I don't know how to leverage
__init_subclass__, but adding 1 line after here makes things work again:jossefaz commentedon Apr 30, 2022
The SQLAlchemy maintainers confirmed that this is the issue, and also suggested a fix : sqlalchemy/sqlalchemy#7972 (reply in thread)
byrman commentedon May 1, 2022
The fix I suggested is backwards compatible. Shall I make a pull request or is there more to it than setting
rel_nameon thecls?byrman commentedon May 1, 2022
Let me know if this can be improved upon: #322.
maresb commentedon May 6, 2022
For reference, the actual error message is:
Pin sqlalchemy to 1.4.35 to fix broken relationships
Update requirements, fix SQLAlchemy version
eddywee commentedon May 18, 2022
thank you @archydeberker !! after hours of debugging i found this issue pinned the version and it works now! <3 thank you!
Fix sqlmodel relationship issue
14 remaining items
tiangolo commentedon Aug 27, 2022
Thanks for the report @archydeberker! 🤓
And thanks for the discussion everyone! This was solved by @byrman in #322.
It will be available in the next version, SQLModel
0.0.7, released in the next hours. 🚀github-actions commentedon Sep 7, 2022
Assuming the original need was handled, this will be automatically closed now. But feel free to add more comments or create new issues or PRs.
mathieu-lemay commentedon Oct 7, 2022
I can still reproduce the issue with
SQLModel==0.0.8andSQLAlchemy==1.4.41Running it gives the following error:
It works fine with
SLQAlchemy==1.4.35byrman commentedon Oct 8, 2022
Indeed, if
sa_relationshipis defined, my naive fix is left untouched due to these lines:Sorry I missed that path! It needs to be addressed, of course, but perhaps you can use this as a workaround:
byrman commentedon Oct 8, 2022
@mathieu-lemay, I made a pull request that covers your case as well: #461. I still have to add a test though.
mathieu-lemay commentedon Oct 11, 2022
@byrman The workaround works so I'm gonna use that. Thanks for the fix!
Fix SQLAlchemy version 1.4.36 breaks SQLModel relationships (fastapi#315
🐛 Fix SQLAlchemy version 1.4.36 breaks SQLModel relationships (#315) (#…