Блокирующий драйвер базы данных и асинхронный веб-фреймворк

Здесь присутствуют асинхронные веб-фреймворки, хотя ORM часто не подходят для асинхронного программирования. Хотя есть ли причина заботиться об этом в типичном сценарии, когда ваша база данных размещена в той же локальной сети, что и ваш сервер для среднего сервиса? В конце концов, время ожидания сетевого ввода-вывода для базы данных будет незначительным по сравнению с запросами из внешних сетей.

В моем конкретном случае у меня есть веб-сервер Python aiohttp, который я хочу подключить к базе данных PostgreSQL. Я бы очень хотел использовать SQL Alchemy в качестве уровня ORM, хотя это подразумевает блокировку запросов, поскольку в слое ORM SQL Alchemy нет поддержки асинхронных драйверов базы данных (есть альтернативы, такие как GINO или async-peewee, хотя они не надежны для производства использовать в моем случае). Этот вопрос относится к любому асинхронному веб-серверу, который может делать запросы на блокировку.

На самом деле это нигде не обсуждается. Споры ведутся о том, готовы ли вы отказаться от стабильной, но синхронной ORM, чтобы использовать асинхронный веб-сервер или нет. Есть ли какой-то вред, который я наблюдаю здесь, учитывая, что база данных будет в той же сети, что и сервер?

Можно порождать потоки для выполнения этих запросов на блокировку, хотя это более важная вещь, которой нужно управлять в вашем приложении, если вы используете ORM, который может неявно генерировать SQL-запросы к базе данных на основе доступа к атрибутам или методам.


person Rodrigo Martins de Oliveira    schedule 02.10.2020    source источник


Ответы (1)


Просто используйте базы данных - он поддерживает async драйверы и SQL Alchemy. Вы можете извлечь query из Alchemy ORM и выполнить его асинхронно.

Но если у вас есть устаревший код - оберните его

def runsql(session):
    return session.query(...).filter(...).all()

result = await loop.run_in_executor(
        None, functools.partial(runsql, session))
person eri    schedule 05.10.2020
comment
Это действительно хороший вариант, я рассмотрю его, спасибо! Одно но: он не поддерживает SQL Alchemy как ORM, он поддерживает SQL Alchemy Core для построения запросов. - person Rodrigo Martins de Oliveira; 07.10.2020