Skip to content

Базы данных

Как реализовать логику подключения к бд без контекстного менеджера?

Для реализации логики подключения к базе данных без использования контекстного менеджера в Python обычно применяют классические подходы с явным открытием и закрытием соединения. Это делается с помощью вызова методов для создания подключения и закрытия его вручную, а также обработки исключений для корректного завершения.

Основные шаги:

  1. Создать подключение к базе данных через соответствующий драйвер (например, psycopg2 для PostgreSQL).

  2. Выполнить необходимые запросы.

  3. Явно закрыть курсор и подключение после выполнения работы, чтобы не было утечек ресурсов.

  4. Обработать возможные ошибки через try-except.

Пример с psycopg2 без контекстного менеджера:

import psycopg2

try:
    conn = psycopg2.connect(
        dbname="mydb",
        user="user",
        password="password",
        host="localhost"
    )
    cursor = conn.cursor()

    cursor.execute("SELECT * FROM my_table")
    results = cursor.fetchall()
    print(results)

    cursor.close()
    conn.close()
except Exception as e:
    print("Ошибка при работе с БД:", e)
    if conn:
        conn.close()

Особенности:

  • Без контекстного менеджера нужно явно закрывать ресурсы (курсоры и подключения).

  • В try-except важно также гарантировать закрытие подключения при ошибках (можно использовать finally).

  • Такой подход менее удобен и подвергается риску забыть закрыть соединение, из-за чего возможны утечки.

Для более надежной работы всё же рекомендуется использовать контекстные менеджеры, но если по каким-то причинам они недоступны, описанный подход работает корректно.


Работа с асинхронными драйверами БД (asyncpg, aiosqlite)

В современных веб-приложениях работа с базой данных часто становится узким местом производительности. Традиционные синхронные драйверы блокируют выполнение кода до завершения запроса к БД, что приводит к простою потоков и неэффективному использованию ресурсов.

Асинхронные драйверы решают эту проблему, позволяя приложению обрабатывать другие запросы пока текущий ожидает ответа от базы данных. Это особенно критично для приложений с высокой нагрузкой, где тысячи пользователей одновременно работают с системой.

Преимущества асинхронных драйверов

  • Высокая производительность - один поток обрабатывает множество запросов
  • Масштабируемость - тысячи одновременных подключений к БД
  • Эффективное использование ресурсов - нет простоев в ожидании I/O

📊 Основные асинхронные драйверы

PostgreSQL - asyncpg

asyncpg считается одним из самых производительных драйверов для PostgreSQL. Он разработан специально для асинхронной работы и показывает лучшие результаты по сравнению с другими драйверами.

import asyncpg

async def get_db():
    return await asyncpg.connect("postgresql://user:pass@localhost/db")

Ключевые особенности:

  • Поддержка подготовленных выражений
  • Встроенный пул соединений
  • Прямой парсинг PostgreSQL протокола
  • Высокая скорость работы

SQLite - aiosqlite

aiosqlite предоставляет асинхронную обертку вокруг стандартной библиотеки SQLite. Хотя SQLite не является полноценной серверной СУБД, он отлично подходит для небольших приложений и прототипирования.

import aiosqlite

async def get_db():
    async with aiosqlite.connect("app.db") as db:
        yield db

Преимущества:

  • Простота настройки
  • Не требует отдельного сервера БД
  • Полная совместимость с SQLite
  • Идеален для разработки и тестирования