Автоматически закрытие соединения базы данных с менеджером контекста
фото Тейлор Вик на Бессмысленно
Если вы не знаете, какой контекстный менеджер рекомендую вам прочитать о них. Дэн Баденс написал хорошую статью. Но так как вы здесь, почему бы не читать Мой пост ?
Сейчас ничего особенного, чтобы написать курсор. Вам нужен драйвер и учетные данные для подключения к базе данных. В этом примере я буду использовать драйвер MySQL. Мои полномочия хранятся в settings.py
(не в простом тексте, а переменные среды) как словарь.
Во-первых, нам нужно предоставить драйверу и учетные данные на наш курсор:
import mysql.connector as connector from settings import DATABASE class Cursor: def __init__(self, host=DATABASE.get('HOST'), user=DATABASE.get('USER'), password=DATABASE.get('PASSWORD'), db_name=DATABASE.get('NAME'), driver=connector, ): self.driver = driver self.connection = self.driver.connect( host=host, user=user, password=password, database=db_name ) self.cursor = self.connection.cursor()
Теперь нам нужно предоставить методы контекстно-менеджера в нашем классе:
class Cursor: def __init__(...) def __enter__(self): return self.cursor def __exit__(self, ext_type, exc_value, traceback): self.cursor.close() if isinstance(exc_value, Exception): self.connection.rollback() else: self.connection.commit() self.connection.close()
И, наконец, нам нужно что-то вернуть из базы данных, когда нужно:
class Cursor: def __init__(...) def __iter__(self): for item in self.cursor: yield item def __enter__(...) def __exit__(...)
Выполнено. Использование – это простой с курсором () как курсор:
Я никогда не удосужился упростить его через @ContextManager
Декоратор, потому что эта реализация отлично работает для меня. И я не уверен, сможем ли мы применить этот декоратор в класс.
Я хотел бы использовать ORM, потому что это делает вещи намного проще и быстрее. Но иногда ORM – это сверхугольник, и вам нужно взаимодействовать с БД вручную.
Надеюсь, вы найдете это полезно, если вам когда-нибудь нужно написать пользовательский курсор.
Оригинал: “https://dev.to/c_v_ya/sql-cursor-via-context-manager-2gc7”