Базы данных
Как реализовать логику подключения к бд без контекстного менеджера?
Для реализации логики подключения к базе данных без использования контекстного менеджера в Python обычно применяют классические подходы с явным открытием и закрытием соединения. Это делается с помощью вызова методов для создания подключения и закрытия его вручную, а также обработки исключений для корректного завершения.
Основные шаги:
-
Создать подключение к базе данных через соответствующий драйвер (например, psycopg2 для PostgreSQL).
-
Выполнить необходимые запросы.
-
Явно закрыть курсор и подключение после выполнения работы, чтобы не было утечек ресурсов.
-
Обработать возможные ошибки через
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
- Идеален для разработки и тестирования