from typing import List, Optional
from sqlmodel import Field, Relationship, Session, SQLModel, create_engine
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
tests: List["Test"] = Relationship(
sa_relationship_kwargs={"cascade": "delete"}
# Doesn't work vvv
# sa_relationship_kwargs={"cascade": "all, delete"}
)
class Test(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
hero_id: Optional[int] = Field(default=None, foreign_key="hero.id")
engine = create_engine("sqlite:///", echo=True)
def create_db_and_tables():
SQLModel.metadata.create_all(engine)
def create_heroes():
hero = Hero(name="Deadpond", secret_name="Dive Wilson")
t1 = Test()
t2 = Test()
hero.tests = [t1, t2]
with Session(engine) as session:
session.add(hero)
session.commit()
session.query(Hero).delete()
session.commit()
heroes = session.query(Hero).all()
print(heroes)
assert len(heroes) == 0
tests = session.query(Test).all()
print(tests)
assert len(tests) == 0
def main(): #
create_db_and_tables() #
create_heroes() #
if __name__ == "__main__": #
main()
"""
2022-01-13 15:37:54,273 INFO sqlalchemy.engine.Engine DELETE FROM hero
2022-01-13 15:37:54,273 INFO sqlalchemy.engine.Engine [generated in 0.00006s] ()
2022-01-13 15:37:54,273 INFO sqlalchemy.engine.Engine COMMIT
2022-01-13 15:37:54,273 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2022-01-13 15:37:54,274 INFO sqlalchemy.engine.Engine SELECT hero.id AS hero_id
FROM hero
2022-01-13 15:37:54,274 INFO sqlalchemy.engine.Engine [generated in 0.00006s] ()
[]
2022-01-13 15:37:54,275 INFO sqlalchemy.engine.Engine SELECT test.id AS test_id, test.hero_id AS test_hero_id
FROM test
2022-01-13 15:37:54,275 INFO sqlalchemy.engine.Engine [generated in 0.00006s] ()
[]
2022-01-13 15:37:54,275 INFO sqlalchemy.engine.Engine ROLLBACK
"""