42 lines
1.2 KiB
Python
42 lines
1.2 KiB
Python
"""Postgres DB realization"""
|
|
|
|
from sqlalchemy.ext import asyncio
|
|
|
|
from server.config import AppConfig
|
|
from server.infra.db.abc import AbstractDB, ConnectError
|
|
|
|
|
|
class AsyncDB(AbstractDB):
|
|
engine: asyncio.AsyncEngine
|
|
async_session: asyncio.async_sessionmaker[asyncio.AsyncSession]
|
|
|
|
def __init__(self, cnf: AppConfig):
|
|
con_arg = {}
|
|
if "postgresql+asyncpg" in str(cnf.db_uri):
|
|
con_arg = {"server_settings": {"search_path": cnf.db_search_path}}
|
|
self.engine = asyncio.create_async_engine(
|
|
str(cnf.db_uri),
|
|
echo=bool(cnf.app_debug),
|
|
connect_args=con_arg,
|
|
pool_recycle=1800,
|
|
)
|
|
|
|
# self.engine.execution_options(stream_results=True)
|
|
if self.engine is None:
|
|
raise ConnectError
|
|
session = asyncio.async_sessionmaker(self.engine, expire_on_commit=False)
|
|
if session is None:
|
|
raise ConnectError
|
|
self.async_session = session
|
|
|
|
async def connect(self):
|
|
"""connect with DB"""
|
|
pass
|
|
|
|
@property
|
|
def session(self):
|
|
return asyncio.async_sessionmaker(self.engine, expire_on_commit=False)
|
|
|
|
def new_session(self):
|
|
return asyncio.async_sessionmaker(self.engine, expire_on_commit=False)()
|