models now are inherently SQL tables with SQLAlchemy's tricks.

Signed-off-by: Cliff Hill <xlorep@darkhelm.org>
This commit is contained in:
2021-09-29 16:20:10 -04:00
parent e49a58c39c
commit 45062c31a1
9 changed files with 459 additions and 169 deletions
+52 -13
View File
@@ -3,23 +3,62 @@ import dataclasses
import datetime
import typing
import sqlalchemy.orm # type: ignore [import]
from playlist.data import base
mapper_registry = sqlalchemy.orm.registry()
@mapper_registry.mapped
@dataclasses.dataclass
class Track(base.BaseData):
"""Model defining a Track object."""
id: int
track_num: int
title: str
artist: str
album_num: int
album: str
album_artist: str
duration: int
rating: typing.Optional[int]
comments: str
added: datetime.datetime
play_count: int
played: typing.Optional[datetime.datetime]
__tablename__ = "tracks"
id: int = dataclasses.field(
init=False,
metadata={"sa": sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)},
)
plex_id: int = dataclasses.field(
metadata={"sa": sqlalchemy.Column(sqlalchemy.Integer, nullable=False)},
)
track_num: int = dataclasses.field(
metadata={"sa": sqlalchemy.Column(sqlalchemy.Integer, nullable=False)},
)
title: str = dataclasses.field(
metadata={"sa": sqlalchemy.Column(sqlalchemy.String(100), nullable=False)},
)
artist: str = dataclasses.field(
metadata={"sa": sqlalchemy.Column(sqlalchemy.String(100), nullable=False)},
)
album_num: int = dataclasses.field(
metadata={"sa": sqlalchemy.Column(sqlalchemy.Integer, nullable=False)},
)
album: str = dataclasses.field(
metadata={"sa": sqlalchemy.Column(sqlalchemy.String(100), nullable=False)},
)
album_artist: str = dataclasses.field(
metadata={"sa": sqlalchemy.Column(sqlalchemy.String(100), nullable=False)},
)
duration: int = dataclasses.field(
metadata={"sa": sqlalchemy.Column(sqlalchemy.Integer, nullable=False)},
)
comments: str = dataclasses.field(
metadata={"sa": sqlalchemy.Column(sqlalchemy.String(2000), nullable=False)},
)
added: datetime.datetime = dataclasses.field(
metadata={"sa": sqlalchemy.Column(sqlalchemy.DateTime, nullable=False)},
)
play_count: int = dataclasses.field(
metadata={"sa": sqlalchemy.Column(sqlalchemy.Integer, nullable=False)},
)
rating: typing.Optional[int] = dataclasses.field(
default=None,
metadata={"sa": sqlalchemy.Column(sqlalchemy.Integer)},
)
played: typing.Optional[datetime.datetime] = dataclasses.field(
default=None,
metadata={"sa": sqlalchemy.Column(sqlalchemy.DateTime)},
)