Skip to content

Commit

Permalink
Test for sa_relationship.
Browse files Browse the repository at this point in the history
  • Loading branch information
byrman committed Oct 9, 2022
1 parent b7b2796 commit 2f16326
Showing 1 changed file with 36 additions and 2 deletions.
38 changes: 36 additions & 2 deletions tests/test_main.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
from typing import Optional
from typing import List, Optional

import pytest
from sqlalchemy.exc import IntegrityError
from sqlmodel import Field, Session, SQLModel, create_engine
from sqlalchemy.orm import RelationshipProperty
from sqlmodel import Field, Relationship, Session, SQLModel, create_engine


def test_should_allow_duplicate_row_if_unique_constraint_is_not_passed(clear_sqlmodel):
Expand Down Expand Up @@ -91,3 +92,36 @@ class Hero(SQLModel, table=True):
session.add(hero_2)
session.commit()
session.refresh(hero_2)


def test_sa_relationship(clear_sqlmodel):
"""Test https://github.com/tiangolo/sqlmodel/issues/315#issuecomment-1272122306"""

class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(unique=True)
heroes: List["Hero"] = Relationship(
sa_relationship=RelationshipProperty("Hero", back_populates="team")
)

class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(unique=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")
team: Optional[Team] = Relationship(
sa_relationship=RelationshipProperty("Team", back_populates="heroes")
)

team_preventers = Team(name="Preventers")
hero_rusty_man = Hero(name="Rusty-Man", team=team_preventers)

engine = create_engine("sqlite://", echo=True)

SQLModel.metadata.create_all(engine)

with Session(engine) as session:
session.add(hero_rusty_man)
session.commit()
session.refresh(hero_rusty_man)
# The next statement should not raise an AttributeError
assert hero_rusty_man.team.name == "Preventers"

0 comments on commit 2f16326

Please sign in to comment.