sqlmodel/docs/tutorial/relationship-attributes/read-relationships.md
Sebastián Ramírez 6d1d86ab85 📝 Add docs
2021-08-24 15:02:48 +02:00

3.9 KiB

Read Relationships

Now that we know how to connect data using relationship Attributes, let's see how to get and read the objects from a relationship.

Select a Hero

First, add a function select_heroes() where we get a hero to start working with, and add that function to the main() function:

# Code above omitted 👆

{!./docs_src/tutorial/relationship_attributes/read_relationships/tutorial001.py[ln:96-100]!}

# Previous code here omitted 👈

{!./docs_src/tutorial/relationship_attributes/read_relationships/tutorial001.py[ln:110-113]!}

# Code below omitted 👇
👀 Full file preview
{!./docs_src/tutorial/relationship_attributes/read_relationships/tutorial001.py!}

Now that we have a hero, we can get the team this hero belongs to.

With what we have learned up to now, we could use a select() statement, then execute it with session.exec(), and then get the .first() result, for example:

# Code above omitted 👆

{!./docs_src/tutorial/relationship_attributes/read_relationships/tutorial001.py[ln:96-105]!}

# Code below omitted 👇
👀 Full file preview
{!./docs_src/tutorial/relationship_attributes/read_relationships/tutorial001.py!}

Get Relationship Team - New Way

But now that we have the relationship attributes, we can just access them, and SQLModel (actually SQLAlchemy) will go and fetch the correspoinding data from the database, and make it available in the attribute.

So, the highlighted block above, has the same results as the block below:

# Code above omitted 👆

{!./docs_src/tutorial/relationship_attributes/read_relationships/tutorial001.py[ln:96-100]!}

        # Code from the previous example omitted 👈

{!./docs_src/tutorial/relationship_attributes/read_relationships/tutorial001.py[ln:107]!}

# Code below omitted 👇
👀 Full file preview
{!./docs_src/tutorial/relationship_attributes/read_relationships/tutorial001.py!}

!!! tip The automatic data fetching will work as long as the starting object (in this case the Hero) is associated with an open session.

For example, here, **inside** a `with` block with a `Session` object.

Get a List of Relationship Objects

And the same way, when we are working on the many side of the one-to-many relationship, we can get a list of of the related objects just by accessing the relationship attribute:

# Code above omitted 👆

{!./docs_src/tutorial/relationship_attributes/read_relationships/tutorial002.py[ln:96-102]!}

# Code below omitted 👇
👀 Full file preview
{!./docs_src/tutorial/relationship_attributes/read_relationships/tutorial002.py!}

That would print a list with all the heroes in the Preventers team:

$ python app.py

// Automatically fetch the heroes
INFO Engine SELECT hero.id AS hero_id, hero.name AS hero_name, hero.secret_name AS hero_secret_name, hero.age AS hero_age, hero.team_id AS hero_team_id 
FROM hero 
WHERE ? = hero.team_id
INFO Engine [cached since 0.8774s ago] (2,)

// Print the list of Preventers
Preventers heroes: [
    Hero(name='Rusty-Man', age=48, id=2, secret_name='Tommy Sharp', team_id=2),
    Hero(name='Spider-Boy', age=None, id=3, secret_name='Pedro Parqueador', team_id=2),
    Hero(name='Tarantula', age=32, id=6, secret_name='Natalia Roman-on', team_id=2),
    Hero(name='Dr. Weird', age=36, id=7, secret_name='Steve Weird', team_id=2),
    Hero(name='Captain North America', age=93, id=8, secret_name='Esteban Rogelios', team_id=2)
]

Recap

With relationship attributes you can use the power of common Python objects to easily access related data from the database. 😎