Как подключиться к базе данных Azure Postgres, для которой требуется SSL, с помощью asyncpgPython

Программы на Python
Ответить
Anonymous
 Как подключиться к базе данных Azure Postgres, для которой требуется SSL, с помощью asyncpg

Сообщение Anonymous »

Я переношу приложение из Flask в FastAPI, а вместе с ним и соединение с базой данных из psycopg2 в asyncpg. В старой реализации URL-адрес базы данных был определен следующим образом: SQLALCHEMY_DATABASE_URI: str = f"postgresql+psycopg2://{DB_USER}:{DB_PASSWD}@{DB_HOST}:5432/{DB_NAME}?sslmode=require"
При переключении на 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
В старой версии было достаточно просто установить флаг sslmode=require, чтобы все работало без проблем в Azure. Теперь, судя по этой проблеме с GitHub, кажется, что единственный способ заставить эту работу работать — предоставить реальный SSL-сертификат следующим образом:

Код: Выделить всё

# 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
)
Однако у меня нет доступа к сертификату SSL, и мне нужен способ подключения к этой базе данных Azure с помощью асинхронного метода без предоставления сертификата SSL в виде файла. Как это можно сделать?

Подробнее здесь: https://stackoverflow.com/questions/792 ... ng-asyncpg
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»