53 lines
1.8 KiB
Python
53 lines
1.8 KiB
Python
import os
|
||
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
|
||
from sqlalchemy.orm import sessionmaker
|
||
from app.services.db_manager import DatabaseManager
|
||
from .model import Base
|
||
try:
|
||
# Настройки PostgreSQL из переменных окружения
|
||
POSTGRES_DSN = os.getenv("POSTGRES_URL")
|
||
|
||
# Создание движка для PostgreSQL
|
||
if POSTGRES_DSN is None:
|
||
raise Exception
|
||
postgres_engine = create_async_engine(POSTGRES_DSN, echo=False)
|
||
except Exception as e:
|
||
print("Ошибки при инициализации сессии постгреса")
|
||
AsyncSessionLocal = sessionmaker(bind=postgres_engine, class_=AsyncSession, expire_on_commit=False)
|
||
|
||
# Инициализация PostgreSQL
|
||
async def init_postgresql():
|
||
"""
|
||
Инициализация подключения к PostgreSQL.
|
||
"""
|
||
try:
|
||
async with postgres_engine.begin() as conn:
|
||
await conn.run_sync(Base.metadata.create_all)
|
||
print("PostgreSQL connected.")
|
||
except Exception as e:
|
||
print(f"Failed to connect to PostgreSQL: {e}")
|
||
|
||
# Получение сессии PostgreSQL
|
||
async def get_postgres_session():
|
||
"""
|
||
Асинхронный генератор сессий PostgreSQL.
|
||
"""
|
||
async with AsyncSessionLocal() as session:
|
||
yield session
|
||
|
||
# Закрытие соединений
|
||
async def close_connections():
|
||
"""
|
||
Закрытие всех соединений с базами данных.
|
||
"""
|
||
# Закрытие PostgreSQL
|
||
await postgres_engine.dispose()
|
||
print("PostgreSQL connection closed.")
|
||
|
||
|
||
def get_database_manager() -> DatabaseManager:
|
||
"""
|
||
Функция-зависимость для получения экземпляра DatabaseManager.
|
||
"""
|
||
return DatabaseManager(get_postgres_session)
|