Open 5cat opened 2 years ago
Hi, I have the same issue with sqlmodel 0.0.6 and python 3.9.9.
I have created a similar virtual env with python 3.8.10 and this piece of code works as expected.
I had a similar issue with 1-M relationship, where the models are also separated into their own files.
sqlmodel == 0.0.6
python == 3.9
Not sure if that helps, but I was able to workaround this issue by removing
from __future__ import annotations
from the file of the "parent" model and returning back to quoting the type hints:
# other imports omitted
from typing import TYPE_CHECKING:
from .child import ChildModel
class ParentModel(SQLModel, table=True):
# children: List[ChildModel] = Relationship(back_populates="parent") # does not work
children: List["ChildModel"] = Relationship(back_populates="parent") # OK
# other column definitions...
I had a similar issue with 1-M relationship, where the models are also separated into their own files.
sqlmodel == 0.0.6 python == 3.9
@l1b3r Do you updated to lastest versions?
I am having some problems with the models separated in different files. The example model of Heroes and Teams, works fine with separate files until I add the model that allows to get a Team with its Heroes. https://sqlmodel.tiangolo.com/tutorial/fastapi/relationships/#update-the-path-operations
Are you using this option, does it work for you?
Thanks
It looks like the forward reference is not evaluated at all, but passed to SQLAlchemy as-is.
I experienced the same issue on version sqlmodel == 0.0.8
This is a pretty confusing problem to have given the selling point of this library.
Postponed annotations are still an issue with 0.0.14
, hence the ruff setting.
I guess it has to do with all the very dark black magic
that SQLAlchemy
does 😅
I also hit this issue (again) with a new project, But removing
from __future__ import annotations
fixed it (again). Just in case someone else hits this issue
Thank you @s-weigand, I removed the annotations
import and SQLAlchemy stopped complaining that classes weren't mapped!
Would have saved me time if I was told that future annotations cannot be used, and that forward type references in SQLModel classes should be enclosed in double quotes to play nice with SA. I guess I should have gleaned this from the docs, on the page about type annotation strings? Considering this issue thread though, I think it's worth addressing explicitly somewhere. I'll look into adding this caveat to the docs if contributions are accepted.
yeah i lost loads of time to this, definitely think 'don't import annotations from future' should be stated somewhere in the docs. unless i missed it?
While documentation is important, is there a plan or a route to fix this? Strings don't work for nice things like Optional[A | B | C]
...
While documentation is important, is there a plan or a route to fix this? Strings don't work for nice things like
Optional[A | B | C]
...
I think you can do something like this Optional["A" | "B" | "C"]
@DirkReiners Forward referenced type annotations are a planned future feature for Python, so I wouldn't expect this library to implement a fix.
I explain the situation and state of the feature in a bit more detail in my PR
Just to double check - this isn't something that would be fixed by adding typing.get_type_hints(...)
somewhere, would it?
Seems reasonable to me that it would fix the problem.
Having the same issue.
I had a similar issue with 1-M relationship, where the models are also separated into their own files.
sqlmodel == 0.0.6 python == 3.9
Not sure if that helps, but I was able to workaround this issue by removing
from __future__ import annotations
from the file of the "parent" model and returning back to quoting the type hints:
# other imports omitted from typing import TYPE_CHECKING: from .child import ChildModel class ParentModel(SQLModel, table=True): # children: List[ChildModel] = Relationship(back_populates="parent") # does not work children: List["ChildModel"] = Relationship(back_populates="parent") # OK # other column definitions...
Although this workaround works for the time being, the code will no longer work in the future (when __future__.annotations become the default), so this should be fixed.
First Check
Commit to Help
Example Code
Description
all what i have done is use the example from the docs about many to many relationships and tried to fit them with
from __future__ import annotation
by adding the import in the first line and changingList["Hero"]
toList[Hero]
. and i get this erroralso
update_forward_refs()
did not help for both classes.Operating System
Linux
Operating System Details
No response
SQLModel Version
0.0.4
Python Version
Python 3.9.9
Additional Context
No response