-
-
Notifications
You must be signed in to change notification settings - Fork 783
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.
Commit to Help
- I commit to help with one of those options 👆
Example Code
from typing import List, Optional
from sqlmodel import Field, Relationship, Session, SQLModel, create_engine
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(index=True)
headquarters: str
heroes: List["Hero"] = Relationship(back_populates="team")
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(index=True)
secret_name: str
age: Optional[int] = Field(default=None, index=True)
team_id: int = Field(default=None, foreign_key="team.id")
team: Team = Relationship(back_populates="heroes")
sqlite_file_name = "database.db"
sqlite_url = f"sqlite:///{sqlite_file_name}"
engine = create_engine(sqlite_url, echo=True)
def create_db_and_tables():
SQLModel.metadata.drop_all(engine)
SQLModel.metadata.create_all(engine)
def create_heroes():
with Session(engine) as session:
team_preventers = Team(name="Preventers", headquarters="Sharp Tower")
hero_rusty_man = Hero(
name="Rusty-Man", secret_name="Tommy Sharp", age=48, team=team_preventers
)
hero_spider_boy = Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
session.add(hero_rusty_man)
session.add(hero_spider_boy)
session.commit()
session.refresh(hero_rusty_man)
session.refresh(hero_spider_boy)
print("Created hero:", hero_rusty_man)
print("Created hero:", hero_spider_boy)
def main():
create_db_and_tables()
create_heroes()
if __name__ == "__main__":
main()Description
The SQLModel docs mention:
If it was required for a
Heroinstance to belong to aTeam, then theteam_idwould beintinstead ofOptional[int].And the
teamattribute would be aTeaminstead ofOptional[Team].
When I tried making this change on the tutorial code in the example above, hero_spider_boy is created with team_id=None, even though the intention was for it to be required for a Hero instance to belong to a Team.
Is there a recommended way to create a required relationship (non-optional) that would enforce the requirement that a Hero instance to belongs to a Team in this example?
Operating System
macOS
Operating System Details
Version: 12.6 (21G115)
SQLModel Version
0.0.8
Python Version
Python 3.10.6
Additional Context
I tried removing the default=None attribute from team_id: int = Field(default=None, foreign_key="team.id"), but when I do that, I get a Pylance error saying Argument missing for parameter "team_id":
