You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.7 KiB
Python
53 lines
1.7 KiB
Python
from __future__ import annotations
|
|
import utils.local as local
|
|
from urllib.parse import quote_plus
|
|
from aiohttp import web
|
|
import asyncpg
|
|
from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession, async_sessionmaker, create_async_engine
|
|
from libs.config import Config
|
|
|
|
def get_dsn():
|
|
db_conf = Config.get("database")
|
|
return "postgresql+asyncpg://%s:%s@%s:%s/%s" % (
|
|
quote_plus(db_conf["user"]),
|
|
quote_plus(db_conf["password"]),
|
|
db_conf["host"],
|
|
db_conf["port"],
|
|
quote_plus(db_conf["database"]))
|
|
|
|
class DatabaseService:
|
|
instance = None
|
|
|
|
@staticmethod
|
|
async def create(app: web.Application = None) -> DatabaseService:
|
|
if app is None:
|
|
if DatabaseService.instance is None:
|
|
DatabaseService.instance = DatabaseService()
|
|
await DatabaseService.instance.init()
|
|
return DatabaseService.instance
|
|
else:
|
|
if "database" not in app:
|
|
instance = DatabaseService()
|
|
await instance.init()
|
|
app["database"] = instance
|
|
|
|
return app["database"]
|
|
|
|
def __init__(self):
|
|
self.pool: asyncpg.pool.Pool = None
|
|
self.engine: AsyncEngine = None
|
|
self.create_session: async_sessionmaker[AsyncSession] = None
|
|
|
|
async def init(self):
|
|
db_conf = Config.get("database")
|
|
|
|
loop = local.loop
|
|
self.pool = await asyncpg.create_pool(**db_conf, loop=loop)
|
|
|
|
engine = create_async_engine(get_dsn(), echo=local.debug)
|
|
self.engine = engine
|
|
self.create_session = async_sessionmaker(engine, expire_on_commit=False)
|
|
|
|
async def close(self):
|
|
await self.engine.dispose()
|
|
await self.pool.close() |