73 lines
1.6 KiB
Python
73 lines
1.6 KiB
Python
from sqlmodel import Field, Relationship, SQLModel, Session, create_engine
|
|
|
|
|
|
class TeamBase(SQLModel):
|
|
name: str = Field(index=True)
|
|
headquarters: str
|
|
|
|
|
|
class Team(TeamBase, table=True):
|
|
id: int | None = Field(default=None, primary_key=True)
|
|
heroes: list["Hero"] = Relationship(back_populates="team")
|
|
|
|
|
|
class TeamCreate(TeamBase):
|
|
pass
|
|
|
|
|
|
class TeamRead(TeamBase):
|
|
name: str | None = None
|
|
headquarters: str | None = None
|
|
|
|
|
|
class HeroBase(SQLModel):
|
|
name: str = Field(index=True)
|
|
secret_name: str
|
|
age: int | None = Field(index=True, default=None)
|
|
team_id: int | None = Field(default=None, foreign_key="team.id")
|
|
|
|
|
|
class Hero(HeroBase, table=True):
|
|
id: int | None = Field(default=None, primary_key=True)
|
|
hashed_password: str = Field()
|
|
team: Team | None = Relationship(back_populates="heroes")
|
|
|
|
|
|
class HeroCreate(HeroBase):
|
|
password: str
|
|
|
|
|
|
class HeroRead(HeroBase):
|
|
id: int
|
|
|
|
|
|
class HeroUpdate(SQLModel):
|
|
name: str | None = None
|
|
secret_name: str | None = None
|
|
age: int | None = None
|
|
password: str | None = None
|
|
team_id: int | None = None
|
|
|
|
|
|
class TeamReadWithHeroes(TeamRead):
|
|
heroes: list[HeroRead] = []
|
|
|
|
|
|
class HeroReadWithTeam(HeroRead):
|
|
team: TeamRead | None = None
|
|
|
|
|
|
SQLITE_FILE_NAME = "database.db"
|
|
DATABASE_URL = f"sqlite:///{SQLITE_FILE_NAME}"
|
|
|
|
connect_args = {"check_same_thread": False}
|
|
engine = create_engine(DATABASE_URL, connect_args=connect_args)
|
|
|
|
|
|
def create_db_and_tables():
|
|
SQLModel.metadata.create_all(engine)
|
|
|
|
|
|
def get_session():
|
|
with Session(engine) as session:
|
|
yield session
|