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.
47 lines
1.6 KiB
Python
47 lines
1.6 KiB
Python
from __future__ import annotations
|
|
import 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
|
|
import config
|
|
|
|
def get_dsn():
|
|
return "postgresql+asyncpg://%s:%s@%s:%s/%s" % (
|
|
quote_plus(config.DATABASE["user"]),
|
|
quote_plus(config.DATABASE["password"]),
|
|
config.DATABASE["host"],
|
|
config.DATABASE["port"],
|
|
quote_plus(config.DATABASE["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):
|
|
loop = local.loop
|
|
self.pool = asyncpg.create_pool(**config.DATABASE, loop=loop)
|
|
await self.pool.__aenter__()
|
|
|
|
engine = create_async_engine(get_dsn(), echo=config.DEBUG)
|
|
self.engine = engine
|
|
self.create_session = async_sessionmaker(engine, expire_on_commit=False) |