chore(db)!: Database methods

This commit is contained in:
2023-08-28 22:54:37 +08:00
parent 1282993810
commit e948b6abea

View File

@ -50,6 +50,8 @@ class Database(metaclass=Singleton):
def sessionmaker(self): def sessionmaker(self):
return self.__sessionmaker return self.__sessionmaker
# region init
def init(self, checkfirst: bool = True): def init(self, checkfirst: bool = True):
# create tables & views # create tables & views
if checkfirst: if checkfirst:
@ -80,6 +82,7 @@ class Database(metaclass=Singleton):
+ list(ScoresBase.metadata.tables.keys()) + list(ScoresBase.metadata.tables.keys())
+ list(ConfigBase.metadata.tables.keys()) + list(ConfigBase.metadata.tables.keys())
+ [ + [
Chart.__tablename__,
ScoreCalculated.__tablename__, ScoreCalculated.__tablename__,
ScoreBest.__tablename__, ScoreBest.__tablename__,
CalculatedPotential.__tablename__, CalculatedPotential.__tablename__,
@ -87,30 +90,56 @@ class Database(metaclass=Singleton):
) )
return all(inspect(self.engine).has_table(t) for t in expect_tables) return all(inspect(self.engine).has_table(t) for t in expect_tables)
# endregion
def version(self) -> Union[int, None]: def version(self) -> Union[int, None]:
stmt = select(Property).where(Property.key == "version") stmt = select(Property).where(Property.key == "version")
with self.sessionmaker() as session: with self.sessionmaker() as session:
result = session.scalar(stmt) result = session.scalar(stmt)
return None if result is None else int(result.value) return None if result is None else int(result.value)
# region Pack
def get_packs(self): def get_packs(self):
stmt = select(Pack) stmt = select(Pack)
with self.sessionmaker() as session: with self.sessionmaker() as session:
results = list(session.scalars(stmt)) results = session.scalars(stmt)
return results return list(results)
def get_pack_by_id(self, value: str): def get_pack_by_id(self, pack_id: str):
stmt = select(Pack).where(Pack.id == value) stmt = select(Pack).where(Pack.id == pack_id)
with self.sessionmaker() as session: with self.sessionmaker() as session:
result = session.scalar(stmt) result = session.scalar(stmt)
return result return result
def get_charts_in_pack(self, pack: str): # endregion
stmt = (
select(ChartInfo) # region Chart
.join(Song, (Song.id == ChartInfo.song_id))
.where(Song.set == pack) def get_charts_by_pack_id(self, pack_id: str):
stmt = select(Chart).where(Chart.set == pack_id)
with self.sessionmaker() as session:
results = session.scalars(stmt)
return list(results)
def get_charts_by_song_id(self, song_id: str):
stmt = select(Chart).where(Chart.song_id == song_id)
with self.sessionmaker() as session:
results = session.scalars(stmt)
return list(results)
def get_chart(self, song_id: str, rating_class: int):
stmt = select(Chart).where(
(Chart.song_id == song_id) & (Chart.rating_class == rating_class)
) )
with self.sessionmaker() as session: with self.sessionmaker() as session:
results = list(session.scalars(stmt)) result = session.scalar(stmt)
return results return result
# endregion
def get_b30(self):
stmt = select(CalculatedPotential.b30).select_from(CalculatedPotential)
with self.sessionmaker() as session:
result = session.scalar(stmt)
return result