При переключении на asyncpg мне пришлось опустить sslmode, поскольку, очевидно, он не поддерживается. Теперь URL-адрес подключения выглядит следующим образом: SQLALCHEMY_DATABASE_URI: str = f"postgresql+asyncpg://{DB_USER}:{DB_PASSWD}@{DB_HOST}:5432/{DB_NAME}"
Проблема в том, что теперь соединение завершается с ошибкой тайм-аута, поскольку Azure отклоняет попытку подключения из-за зависимости SSL.
Мой код для подключения к базе данных выглядит следующим образом:
Код: Выделить всё
from sqlmodel import SQLModel
from sqlmodel.ext.asyncio.session import AsyncSession
from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine
from sqlalchemy.orm import sessionmaker
from typing import AsyncGenerator
from config import config
from utils.logging import logger
engine: AsyncEngine = create_async_engine(
url=config.SQLALCHEMY_DATABASE_URI,
echo=config.DB_ECHO,
pool_pre_ping=True,
pool_size=20,
max_overflow=10
)
async_session_maker = sessionmaker(
bind=engine,
class_=AsyncSession,
expire_on_commit=False,
autocommit=False,
autoflush=False,
)
async def get_session() -> AsyncGenerator[AsyncSession, None]:
logger.debug(f"DB url: {config.SQLALCHEMY_DATABASE_URI}")
"""Yield a database session"""
async with async_session_maker() as session:
try:
yield session
await session.commit()
except Exception as e:
await session.rollback()
raise
Код: Выделить всё
# Set up SSL context
ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_context.load_cert_chain(certfile=config.SSL_CERT_FILE, keyfile=config.SSL_KEY_FILE)
# SQLAlchemy URL, now with SSL parameters
SQLALCHEMY_DATABASE_URI: str = f"postgresql+asyncpg://{DB_USER}:{DB_PASSWD}@{DB_HOST}:5432/{DB_NAME}"
# Create engine with SSL context
engine = create_async_engine(
url=SQLALCHEMY_DATABASE_URI,
echo=config.DB_ECHO,
pool_pre_ping=True,
pool_size=20,
max_overflow=10,
connect_args={"ssl": ssl_context} # Pass SSL context
)
Подробнее здесь: https://stackoverflow.com/questions/792 ... ng-asyncpg
Мобильная версия