15 lines
2.5 KiB
Plaintext
15 lines
2.5 KiB
Plaintext
{
|
|
"cells": [
|
|
{"cell_type":"markdown","metadata":{},"source":["# 03 — Relationships (Team ↔ Hero)\n\n","Demonstrates one-to-many relationship and eager loading with selectinload."]},
|
|
{"cell_type":"markdown","metadata":{},"source":["## 0. Install (optional)"]},
|
|
{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["# %pip install -e . pytest\n"]},
|
|
{"cell_type":"markdown","metadata":{},"source":["## 1. Optional: SQLite in-memory for demo"]},
|
|
{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["from sqlmodel_pg_kit import db\n","db.cfg = db.DatabaseConfig(host='', port=0, user='', password='', database=':memory:', sslmode='disable')\n","db.engine = db.create_engine('sqlite:///:memory:', echo=False)\n"]},
|
|
{"cell_type":"markdown","metadata":{},"source":["## 2. Create Team and Hero, eager load with selectinload"]},
|
|
{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["from typing import List, Optional\n","from sqlalchemy.orm import selectinload\n","from sqlmodel import select, SQLModel, Field, Relationship\n","from sqlmodel_pg_kit import create_all\n","from sqlmodel_pg_kit.db import get_session\n","\n","class Team(SQLModel, table=True):\n"," id: Optional[int] = Field(default=None, primary_key=True)\n"," name: str = Field(index=True)\n"," heroes: List['Hero'] = Relationship(back_populates='team')\n","\n","class Hero(SQLModel, table=True):\n"," id: Optional[int] = Field(default=None, primary_key=True)\n"," name: str = Field(index=True)\n"," age: Optional[int] = None\n"," team_id: Optional[int] = Field(default=None, foreign_key='team.id')\n"," team: Optional[Team] = Relationship(back_populates='heroes')\n","\n","create_all()\n","with get_session() as s:\n"," s.execute(Hero.__table__.delete())\n"," s.execute(Team.__table__.delete())\n"," s.commit()\n"," t = Team(name='Avengers'); s.add(t); s.commit(); s.refresh(t)\n"," s.add(Hero(name='Thor', age=1500, team_id=t.id))\n"," s.add(Hero(name='Hulk', age=49, team_id=t.id))\n"," s.commit()\n","\n","stmt = select(Hero).options(selectinload(Hero.team)).order_by(Hero.id.asc())\n","with get_session() as s:\n"," heroes: List[Hero] = s.exec(stmt).all()\n","[(h.name, h.team.name if h.team else None) for h in heroes]\n"]}
|
|
],
|
|
"metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"name": "python", "pygments_lexer": "ipython3"}},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|