mirror of
https://github.com/283375/arcaea-offline.git
synced 2025-07-01 12:16:26 +00:00
refactor: Database
class
This commit is contained in:
@ -1,22 +1,48 @@
|
||||
from sqlalchemy import Engine
|
||||
from sqlalchemy.orm import Session
|
||||
from sqlalchemy import Engine, select
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
|
||||
from .models.common import *
|
||||
from .models.scores import *
|
||||
from .models.songs import *
|
||||
from .singleton import Singleton
|
||||
|
||||
|
||||
def init(engine: Engine, checkfirst: bool = True):
|
||||
# sqlalchemy-utils issue #396
|
||||
# view.create_view() causes DuplicateTableError on Base.metadata.create_all(checkfirst=True)
|
||||
# https://github.com/kvesteri/sqlalchemy-utils/issues/396
|
||||
if checkfirst:
|
||||
ScoresViewBase.metadata.drop_all(engine)
|
||||
class Database(metaclass=Singleton):
|
||||
def __init__(self, engine: Engine):
|
||||
self.engine = engine
|
||||
|
||||
SongsBase.metadata.create_all(engine, checkfirst=checkfirst)
|
||||
ScoresBase.metadata.create_all(engine, checkfirst=checkfirst)
|
||||
ScoresViewBase.metadata.create_all(engine)
|
||||
CommonBase.metadata.create_all(engine, checkfirst=checkfirst)
|
||||
with Session(engine) as session:
|
||||
session.add(Property(id="version", value="2"))
|
||||
session.commit()
|
||||
@property
|
||||
def engine(self):
|
||||
return self.__engine
|
||||
|
||||
@engine.setter
|
||||
def engine(self, value: Engine):
|
||||
if not isinstance(value, Engine):
|
||||
raise ValueError("Database.engine only accepts sqlalchemy.Engine")
|
||||
self.__engine = value
|
||||
self.__sessionmaker = sessionmaker(self.__engine)
|
||||
|
||||
@property
|
||||
def sessionmaker(self):
|
||||
return self.__sessionmaker
|
||||
|
||||
def init(self, checkfirst: bool = True):
|
||||
# create tables & views
|
||||
if checkfirst:
|
||||
# > https://github.com/kvesteri/sqlalchemy-utils/issues/396
|
||||
# > view.create_view() causes DuplicateTableError on Base.metadata.create_all(checkfirst=True)
|
||||
# so if `checkfirst` is True, drop these views before creating
|
||||
ScoresViewBase.metadata.drop_all(self.engine)
|
||||
|
||||
SongsBase.metadata.create_all(self.engine, checkfirst=checkfirst)
|
||||
ScoresBase.metadata.create_all(self.engine, checkfirst=checkfirst)
|
||||
ScoresViewBase.metadata.create_all(self.engine)
|
||||
CommonBase.metadata.create_all(self.engine, checkfirst=checkfirst)
|
||||
|
||||
# insert version property
|
||||
with self.sessionmaker() as session:
|
||||
stmt = select(Property.value).where(Property.key == "version")
|
||||
result = session.execute(stmt).fetchone()
|
||||
if not checkfirst or not result:
|
||||
session.add(Property(key="version", value="2"))
|
||||
session.commit()
|
||||
|
Reference in New Issue
Block a user