Работа с Firebird из Python асинхронно

У вас FastAPI-сервис, aiogram-бот или любой другой asyncio-код — и в него нужно прикрутить Firebird. Стандартный путь «возьму fdb и вызову из хэндлера» упирается в неприятный факт: драйверы Firebird блокирующие, и каждый запрос к базе намертво вешает event loop. Один медленный SELECT — и весь сервис стоит.

Выхода два: городить ручные обёртки через run_in_executor или взять готовый асинхронный диалект SQLAlchemy. Разберём второй — библиотеку sqlalchemy-firebird-async (MIT, статус Production/Stable, требует SQLAlchemy 2.0+).

Выбор бэкенда

Диалект работает поверх трёх драйверов:

Установка

Бэкенд ставится extra-зависимостью:

pip install "sqlalchemy-firebird-async[fdb]"
# или
pip install "sqlalchemy-firebird-async[firebird-driver]"
# или (экспериментально)
pip install "sqlalchemy-firebird-async[firebirdsql]"

Быстрый старт

from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker
from sqlalchemy import text

dsn = "firebird+fdb_async://sysdba:masterkey@localhost:3050//firebird/data/employee.fdb"

engine = create_async_engine(dsn, echo=True)

async def main():
    async with engine.connect() as conn:
        result = await conn.execute(text("select * from EMPLOYEE"))
        for row in result:
            print(row)

asyncio.run(main())

Формат строки: firebird+<бэкенд>_async://user:password@host:port/path/to/db. Для современного драйвера можно добавить кодировку: ...employee.fdb?charset=UTF8.

Схемы URL

БэкендСхема URL
fdb (легаси, пул потоков)firebird+fdb_async://user:pass@host:port/db_path
firebird-driver (FB 3+)firebird+firebird_async://user:pass@host:port/db_path
firebirdsql (asyncio)firebird+firebirdsql_async://user:pass@host:port/db_path

Производительность

Бенчмарк автора библиотеки: 8 конкурентных задач по 5000 запросов (4 raw SQL + 4 ORM), суммарно 40 тысяч строк.

Метрикаfdb (пул потоков)firebirdsql (патченный)
Общее время4,53 с116,20 с
Параллелизм6,16x7,94x

Вывод честный: пул потоков с C-драйвером пока быстрее «настоящего» asyncio-драйвера на порядок — берите fdb-бэкенд, пока firebirdsql не пофиксят.

Подводные камни

Что почитать дальше

Обсуждение