Skip to content

Remove Relationships

Now let's say that Spider-Boy tells Rusty-Man something like:

I don't feel so good Mr. Sharp

And then for some reason needs to leave the Preventers for some years. 😭

We can remove the relationship by setting it to None, the same as with the team_id, it also works with the new relationship attribute .team:

# Code above omitted 👆  def update_heroes():  with Session(engine) as session:  statement = select(Hero).where(Hero.name == "Spider-Boy")  result = session.exec(statement)  hero_spider_boy = result.one()   hero_spider_boy.team = None  session.add(hero_spider_boy)  session.commit()   session.refresh(hero_spider_boy)  print("Spider-Boy without team:", hero_spider_boy)  # Code below omitted 👇 
👀 Full file preview
from sqlmodel import Field, Relationship, Session, SQLModel, create_engine, select   class Team(SQLModel, table=True):  id: int | None = 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: int | None = Field(default=None, primary_key=True)  name: str = Field(index=True)  secret_name: str  age: int | None = Field(default=None, index=True)   team_id: int | None = Field(default=None, foreign_key="team.id")  team: Team | None = 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.create_all(engine)   def create_heroes():  with Session(engine) as session:  team_preventers = Team(name="Preventers", headquarters="Sharp Tower")  team_z_force = Team(name="Z-Force", headquarters="Sister Margaret's Bar")   hero_deadpond = Hero(  name="Deadpond", secret_name="Dive Wilson", team=team_z_force  )  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_deadpond)  session.add(hero_rusty_man)  session.add(hero_spider_boy)  session.commit()   session.refresh(hero_deadpond)  session.refresh(hero_rusty_man)  session.refresh(hero_spider_boy)   print("Created hero:", hero_deadpond)  print("Created hero:", hero_rusty_man)  print("Created hero:", hero_spider_boy)   hero_spider_boy.team = team_preventers  session.add(hero_spider_boy)  session.commit()  session.refresh(hero_spider_boy)  print("Updated hero:", hero_spider_boy)   hero_black_lion = Hero(name="Black Lion", secret_name="Trevor Challa", age=35)  hero_sure_e = Hero(name="Princess Sure-E", secret_name="Sure-E")  team_wakaland = Team(  name="Wakaland",  headquarters="Wakaland Capital City",  heroes=[hero_black_lion, hero_sure_e],  )  session.add(team_wakaland)  session.commit()  session.refresh(team_wakaland)  print("Team Wakaland:", team_wakaland)   hero_tarantula = Hero(name="Tarantula", secret_name="Natalia Roman-on", age=32)  hero_dr_weird = Hero(name="Dr. Weird", secret_name="Steve Weird", age=36)  hero_cap = Hero(  name="Captain North America", secret_name="Esteban Rogelios", age=93  )   team_preventers.heroes.append(hero_tarantula)  team_preventers.heroes.append(hero_dr_weird)  team_preventers.heroes.append(hero_cap)  session.add(team_preventers)  session.commit()  session.refresh(hero_tarantula)  session.refresh(hero_dr_weird)  session.refresh(hero_cap)  print("Preventers new hero:", hero_tarantula)  print("Preventers new hero:", hero_dr_weird)  print("Preventers new hero:", hero_cap)   def select_heroes():  with Session(engine) as session:  statement = select(Team).where(Team.name == "Preventers")  result = session.exec(statement)  team_preventers = result.one()   print("Preventers heroes:", team_preventers.heroes)   def update_heroes():  with Session(engine) as session:  statement = select(Hero).where(Hero.name == "Spider-Boy")  result = session.exec(statement)  hero_spider_boy = result.one()   hero_spider_boy.team = None  session.add(hero_spider_boy)  session.commit()   session.refresh(hero_spider_boy)  print("Spider-Boy without team:", hero_spider_boy)   def main():  create_db_and_tables()  create_heroes()  select_heroes()  update_heroes()   if __name__ == "__main__":  main() 
🤓 Other versions and variants
from typing import Optional  from sqlmodel import Field, Relationship, Session, SQLModel, create_engine, select   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: Optional[int] = Field(default=None, foreign_key="team.id")  team: Optional[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.create_all(engine)   def create_heroes():  with Session(engine) as session:  team_preventers = Team(name="Preventers", headquarters="Sharp Tower")  team_z_force = Team(name="Z-Force", headquarters="Sister Margaret's Bar")   hero_deadpond = Hero(  name="Deadpond", secret_name="Dive Wilson", team=team_z_force  )  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_deadpond)  session.add(hero_rusty_man)  session.add(hero_spider_boy)  session.commit()   session.refresh(hero_deadpond)  session.refresh(hero_rusty_man)  session.refresh(hero_spider_boy)   print("Created hero:", hero_deadpond)  print("Created hero:", hero_rusty_man)  print("Created hero:", hero_spider_boy)   hero_spider_boy.team = team_preventers  session.add(hero_spider_boy)  session.commit()  session.refresh(hero_spider_boy)  print("Updated hero:", hero_spider_boy)   hero_black_lion = Hero(name="Black Lion", secret_name="Trevor Challa", age=35)  hero_sure_e = Hero(name="Princess Sure-E", secret_name="Sure-E")  team_wakaland = Team(  name="Wakaland",  headquarters="Wakaland Capital City",  heroes=[hero_black_lion, hero_sure_e],  )  session.add(team_wakaland)  session.commit()  session.refresh(team_wakaland)  print("Team Wakaland:", team_wakaland)   hero_tarantula = Hero(name="Tarantula", secret_name="Natalia Roman-on", age=32)  hero_dr_weird = Hero(name="Dr. Weird", secret_name="Steve Weird", age=36)  hero_cap = Hero(  name="Captain North America", secret_name="Esteban Rogelios", age=93  )   team_preventers.heroes.append(hero_tarantula)  team_preventers.heroes.append(hero_dr_weird)  team_preventers.heroes.append(hero_cap)  session.add(team_preventers)  session.commit()  session.refresh(hero_tarantula)  session.refresh(hero_dr_weird)  session.refresh(hero_cap)  print("Preventers new hero:", hero_tarantula)  print("Preventers new hero:", hero_dr_weird)  print("Preventers new hero:", hero_cap)   def select_heroes():  with Session(engine) as session:  statement = select(Team).where(Team.name == "Preventers")  result = session.exec(statement)  team_preventers = result.one()   print("Preventers heroes:", team_preventers.heroes)   def update_heroes():  with Session(engine) as session:  statement = select(Hero).where(Hero.name == "Spider-Boy")  result = session.exec(statement)  hero_spider_boy = result.one()   hero_spider_boy.team = None  session.add(hero_spider_boy)  session.commit()   session.refresh(hero_spider_boy)  print("Spider-Boy without team:", hero_spider_boy)   def main():  create_db_and_tables()  create_heroes()  select_heroes()  update_heroes()   if __name__ == "__main__":  main() 
from typing import List, Optional  from sqlmodel import Field, Relationship, Session, SQLModel, create_engine, select   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: Optional[int] = Field(default=None, foreign_key="team.id")  team: Optional[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.create_all(engine)   def create_heroes():  with Session(engine) as session:  team_preventers = Team(name="Preventers", headquarters="Sharp Tower")  team_z_force = Team(name="Z-Force", headquarters="Sister Margaret's Bar")   hero_deadpond = Hero(  name="Deadpond", secret_name="Dive Wilson", team=team_z_force  )  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_deadpond)  session.add(hero_rusty_man)  session.add(hero_spider_boy)  session.commit()   session.refresh(hero_deadpond)  session.refresh(hero_rusty_man)  session.refresh(hero_spider_boy)   print("Created hero:", hero_deadpond)  print("Created hero:", hero_rusty_man)  print("Created hero:", hero_spider_boy)   hero_spider_boy.team = team_preventers  session.add(hero_spider_boy)  session.commit()  session.refresh(hero_spider_boy)  print("Updated hero:", hero_spider_boy)   hero_black_lion = Hero(name="Black Lion", secret_name="Trevor Challa", age=35)  hero_sure_e = Hero(name="Princess Sure-E", secret_name="Sure-E")  team_wakaland = Team(  name="Wakaland",  headquarters="Wakaland Capital City",  heroes=[hero_black_lion, hero_sure_e],  )  session.add(team_wakaland)  session.commit()  session.refresh(team_wakaland)  print("Team Wakaland:", team_wakaland)   hero_tarantula = Hero(name="Tarantula", secret_name="Natalia Roman-on", age=32)  hero_dr_weird = Hero(name="Dr. Weird", secret_name="Steve Weird", age=36)  hero_cap = Hero(  name="Captain North America", secret_name="Esteban Rogelios", age=93  )   team_preventers.heroes.append(hero_tarantula)  team_preventers.heroes.append(hero_dr_weird)  team_preventers.heroes.append(hero_cap)  session.add(team_preventers)  session.commit()  session.refresh(hero_tarantula)  session.refresh(hero_dr_weird)  session.refresh(hero_cap)  print("Preventers new hero:", hero_tarantula)  print("Preventers new hero:", hero_dr_weird)  print("Preventers new hero:", hero_cap)   def select_heroes():  with Session(engine) as session:  statement = select(Team).where(Team.name == "Preventers")  result = session.exec(statement)  team_preventers = result.one()   print("Preventers heroes:", team_preventers.heroes)   def update_heroes():  with Session(engine) as session:  statement = select(Hero).where(Hero.name == "Spider-Boy")  result = session.exec(statement)  hero_spider_boy = result.one()   hero_spider_boy.team = None  session.add(hero_spider_boy)  session.commit()   session.refresh(hero_spider_boy)  print("Spider-Boy without team:", hero_spider_boy)   def main():  create_db_and_tables()  create_heroes()  select_heroes()  update_heroes()   if __name__ == "__main__":  main() 

And of course, we should remember to add this update_heroes() function to main() so that it runs when we call this program from the command line:

# Code above omitted 👆  def main():  create_db_and_tables()  create_heroes()  select_heroes()  update_heroes()  # Code below omitted 👇 
👀 Full file preview
from sqlmodel import Field, Relationship, Session, SQLModel, create_engine, select   class Team(SQLModel, table=True):  id: int | None = 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: int | None = Field(default=None, primary_key=True)  name: str = Field(index=True)  secret_name: str  age: int | None = Field(default=None, index=True)   team_id: int | None = Field(default=None, foreign_key="team.id")  team: Team | None = 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.create_all(engine)   def create_heroes():  with Session(engine) as session:  team_preventers = Team(name="Preventers", headquarters="Sharp Tower")  team_z_force = Team(name="Z-Force", headquarters="Sister Margaret's Bar")   hero_deadpond = Hero(  name="Deadpond", secret_name="Dive Wilson", team=team_z_force  )  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_deadpond)  session.add(hero_rusty_man)  session.add(hero_spider_boy)  session.commit()   session.refresh(hero_deadpond)  session.refresh(hero_rusty_man)  session.refresh(hero_spider_boy)   print("Created hero:", hero_deadpond)  print("Created hero:", hero_rusty_man)  print("Created hero:", hero_spider_boy)   hero_spider_boy.team = team_preventers  session.add(hero_spider_boy)  session.commit()  session.refresh(hero_spider_boy)  print("Updated hero:", hero_spider_boy)   hero_black_lion = Hero(name="Black Lion", secret_name="Trevor Challa", age=35)  hero_sure_e = Hero(name="Princess Sure-E", secret_name="Sure-E")  team_wakaland = Team(  name="Wakaland",  headquarters="Wakaland Capital City",  heroes=[hero_black_lion, hero_sure_e],  )  session.add(team_wakaland)  session.commit()  session.refresh(team_wakaland)  print("Team Wakaland:", team_wakaland)   hero_tarantula = Hero(name="Tarantula", secret_name="Natalia Roman-on", age=32)  hero_dr_weird = Hero(name="Dr. Weird", secret_name="Steve Weird", age=36)  hero_cap = Hero(  name="Captain North America", secret_name="Esteban Rogelios", age=93  )   team_preventers.heroes.append(hero_tarantula)  team_preventers.heroes.append(hero_dr_weird)  team_preventers.heroes.append(hero_cap)  session.add(team_preventers)  session.commit()  session.refresh(hero_tarantula)  session.refresh(hero_dr_weird)  session.refresh(hero_cap)  print("Preventers new hero:", hero_tarantula)  print("Preventers new hero:", hero_dr_weird)  print("Preventers new hero:", hero_cap)   def select_heroes():  with Session(engine) as session:  statement = select(Team).where(Team.name == "Preventers")  result = session.exec(statement)  team_preventers = result.one()   print("Preventers heroes:", team_preventers.heroes)   def update_heroes():  with Session(engine) as session:  statement = select(Hero).where(Hero.name == "Spider-Boy")  result = session.exec(statement)  hero_spider_boy = result.one()   hero_spider_boy.team = None  session.add(hero_spider_boy)  session.commit()   session.refresh(hero_spider_boy)  print("Spider-Boy without team:", hero_spider_boy)   def main():  create_db_and_tables()  create_heroes()  select_heroes()  update_heroes()   if __name__ == "__main__":  main() 
🤓 Other versions and variants
from typing import Optional  from sqlmodel import Field, Relationship, Session, SQLModel, create_engine, select   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: Optional[int] = Field(default=None, foreign_key="team.id")  team: Optional[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.create_all(engine)   def create_heroes():  with Session(engine) as session:  team_preventers = Team(name="Preventers", headquarters="Sharp Tower")  team_z_force = Team(name="Z-Force", headquarters="Sister Margaret's Bar")   hero_deadpond = Hero(  name="Deadpond", secret_name="Dive Wilson", team=team_z_force  )  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_deadpond)  session.add(hero_rusty_man)  session.add(hero_spider_boy)  session.commit()   session.refresh(hero_deadpond)  session.refresh(hero_rusty_man)  session.refresh(hero_spider_boy)   print("Created hero:", hero_deadpond)  print("Created hero:", hero_rusty_man)  print("Created hero:", hero_spider_boy)   hero_spider_boy.team = team_preventers  session.add(hero_spider_boy)  session.commit()  session.refresh(hero_spider_boy)  print("Updated hero:", hero_spider_boy)   hero_black_lion = Hero(name="Black Lion", secret_name="Trevor Challa", age=35)  hero_sure_e = Hero(name="Princess Sure-E", secret_name="Sure-E")  team_wakaland = Team(  name="Wakaland",  headquarters="Wakaland Capital City",  heroes=[hero_black_lion, hero_sure_e],  )  session.add(team_wakaland)  session.commit()  session.refresh(team_wakaland)  print("Team Wakaland:", team_wakaland)   hero_tarantula = Hero(name="Tarantula", secret_name="Natalia Roman-on", age=32)  hero_dr_weird = Hero(name="Dr. Weird", secret_name="Steve Weird", age=36)  hero_cap = Hero(  name="Captain North America", secret_name="Esteban Rogelios", age=93  )   team_preventers.heroes.append(hero_tarantula)  team_preventers.heroes.append(hero_dr_weird)  team_preventers.heroes.append(hero_cap)  session.add(team_preventers)  session.commit()  session.refresh(hero_tarantula)  session.refresh(hero_dr_weird)  session.refresh(hero_cap)  print("Preventers new hero:", hero_tarantula)  print("Preventers new hero:", hero_dr_weird)  print("Preventers new hero:", hero_cap)   def select_heroes():  with Session(engine) as session:  statement = select(Team).where(Team.name == "Preventers")  result = session.exec(statement)  team_preventers = result.one()   print("Preventers heroes:", team_preventers.heroes)   def update_heroes():  with Session(engine) as session:  statement = select(Hero).where(Hero.name == "Spider-Boy")  result = session.exec(statement)  hero_spider_boy = result.one()   hero_spider_boy.team = None  session.add(hero_spider_boy)  session.commit()   session.refresh(hero_spider_boy)  print("Spider-Boy without team:", hero_spider_boy)   def main():  create_db_and_tables()  create_heroes()  select_heroes()  update_heroes()   if __name__ == "__main__":  main() 
from typing import List, Optional  from sqlmodel import Field, Relationship, Session, SQLModel, create_engine, select   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: Optional[int] = Field(default=None, foreign_key="team.id")  team: Optional[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.create_all(engine)   def create_heroes():  with Session(engine) as session:  team_preventers = Team(name="Preventers", headquarters="Sharp Tower")  team_z_force = Team(name="Z-Force", headquarters="Sister Margaret's Bar")   hero_deadpond = Hero(  name="Deadpond", secret_name="Dive Wilson", team=team_z_force  )  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_deadpond)  session.add(hero_rusty_man)  session.add(hero_spider_boy)  session.commit()   session.refresh(hero_deadpond)  session.refresh(hero_rusty_man)  session.refresh(hero_spider_boy)   print("Created hero:", hero_deadpond)  print("Created hero:", hero_rusty_man)  print("Created hero:", hero_spider_boy)   hero_spider_boy.team = team_preventers  session.add(hero_spider_boy)  session.commit()  session.refresh(hero_spider_boy)  print("Updated hero:", hero_spider_boy)   hero_black_lion = Hero(name="Black Lion", secret_name="Trevor Challa", age=35)  hero_sure_e = Hero(name="Princess Sure-E", secret_name="Sure-E")  team_wakaland = Team(  name="Wakaland",  headquarters="Wakaland Capital City",  heroes=[hero_black_lion, hero_sure_e],  )  session.add(team_wakaland)  session.commit()  session.refresh(team_wakaland)  print("Team Wakaland:", team_wakaland)   hero_tarantula = Hero(name="Tarantula", secret_name="Natalia Roman-on", age=32)  hero_dr_weird = Hero(name="Dr. Weird", secret_name="Steve Weird", age=36)  hero_cap = Hero(  name="Captain North America", secret_name="Esteban Rogelios", age=93  )   team_preventers.heroes.append(hero_tarantula)  team_preventers.heroes.append(hero_dr_weird)  team_preventers.heroes.append(hero_cap)  session.add(team_preventers)  session.commit()  session.refresh(hero_tarantula)  session.refresh(hero_dr_weird)  session.refresh(hero_cap)  print("Preventers new hero:", hero_tarantula)  print("Preventers new hero:", hero_dr_weird)  print("Preventers new hero:", hero_cap)   def select_heroes():  with Session(engine) as session:  statement = select(Team).where(Team.name == "Preventers")  result = session.exec(statement)  team_preventers = result.one()   print("Preventers heroes:", team_preventers.heroes)   def update_heroes():  with Session(engine) as session:  statement = select(Hero).where(Hero.name == "Spider-Boy")  result = session.exec(statement)  hero_spider_boy = result.one()   hero_spider_boy.team = None  session.add(hero_spider_boy)  session.commit()   session.refresh(hero_spider_boy)  print("Spider-Boy without team:", hero_spider_boy)   def main():  create_db_and_tables()  create_heroes()  select_heroes()  update_heroes()   if __name__ == "__main__":  main() 

Recap

This chapter was too short for a recap, wasn't it? 🤔

Anyway, relationship attributes make it easy and intuitive to work with relationships stored in the database. 🎉