fast_api_and_db/models.py

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, echo=True, connect_args=connect_args)
def create_db_and_tables():
SQLModel.metadata.create_all(engine)
def get_session():
with Session(engine) as session:
yield session