Небольшие изменения

This commit is contained in:
brusnitsyn
2026-03-13 17:11:39 +09:00
parent c201d36ae6
commit de2dd82fa1
18 changed files with 1140 additions and 491 deletions

View File

@@ -76,6 +76,11 @@ class Settings(BaseSettings):
"""Формирование строки подключения к PostgreSQL"""
return rf'postgresql://{self.POSTGRES_USERNAME}:{self.POSTGRES_PASSWORD}@{self.POSTGRES_HOST}:{self.POSTGRES_PORT}/{self.POSTGRES_DATABASE}'
@property
def POSTGRES_ASYNC_CONNECTION_STRING(self) -> str:
"""Формирование строки подключения к PostgreSQL"""
return rf'postgresql+asyncpg://{self.POSTGRES_USERNAME}:{self.POSTGRES_PASSWORD}@{self.POSTGRES_HOST}:{self.POSTGRES_PORT}/{self.POSTGRES_DATABASE}'
class Config:
env_file = '.env'
case_sensitive = False

View File

@@ -1,8 +1,9 @@
from sqlalchemy import create_engine
from sqlalchemy.engine import Engine
from sqlalchemy.orm import sessionmaker
from contextlib import contextmanager
from typing import Optional
from sqlalchemy.ext.asyncio import AsyncSession, AsyncEngine, create_async_engine, async_sessionmaker
from contextlib import asynccontextmanager, contextmanager
from typing import AsyncGenerator, Optional
from app.core.config import settings
@@ -12,7 +13,9 @@ class DatabaseConnector:
def __init__(self):
self._src_engine: Optional[Engine] = None
self._dst_engine: Optional[Engine] = None
self._async_dst_engine: Optional[AsyncEngine] = None
self.dst_session = None
self._async_dst_session_maker = None
self.schedule_session = None
@property
@@ -20,7 +23,7 @@ class DatabaseConnector:
"""Подключение к MSSQL"""
if not self._src_engine:
self._src_engine = create_engine(
settings.MSSQL_CONNECTION_STRING,
settings.MSSQL_CONNECTION_STRING + "?charset=cp1251",
pool_pre_ping=True,
echo=settings.DEBUG
)
@@ -33,10 +36,57 @@ class DatabaseConnector:
self._dst_engine = create_engine(
settings.POSTGRES_CONNECTION_STRING,
pool_pre_ping=True,
echo=settings.DEBUG
echo=settings.DEBUG,
connect_args={
"options": "-c client_encoding=utf8"
}
)
self.dst_session = sessionmaker(bind=self._dst_engine)
return self._dst_engine
@property
def async_dst_engine(self) -> AsyncEngine:
"""Асинхронное подключение к PostgreSQL (основная БД)"""
if not self._async_dst_engine:
self._async_dst_engine = create_async_engine(
settings.POSTGRES_ASYNC_CONNECTION_STRING,
pool_pre_ping=True,
echo=settings.DEBUG,
connect_args={
"server_settings": {
"client_encoding": "UTF8"
}
}
)
self._async_dst_session_maker = async_sessionmaker(
bind=self._async_dst_engine,
class_=AsyncSession,
expire_on_commit=False,
autocommit=False,
autoflush=False,
)
return self._async_dst_engine
@asynccontextmanager
async def async_dst_session(self) -> AsyncGenerator[AsyncSession, None]:
"""
Асинхронный контекстный менеджер для сессии PostgreSQL.
Использование:
async with db_connector.async_dst_session() as session:
result = await session.execute(select(...))
"""
self.async_dst_engine
async with self._async_dst_session_maker() as session:
try:
yield session
await session.commit()
except Exception:
await session.rollback()
raise
finally:
await session.close()
@contextmanager
def src_connection(self):
@@ -56,12 +106,14 @@ class DatabaseConnector:
finally:
conn.close()
def dispose_engines(self):
async def dispose_engines(self):
"""Закрытие всех соединений"""
if self._src_engine:
self._src_engine.dispose()
if self._dst_engine:
self._dst_engine.dispose()
if self._async_dst_engine:
await self._async_dst_engine.dispose()
# Глобальный экземпляр подключений