Рубрики
Без рубрики

SQL курсор через контекстный менеджер

Автоматически закрывая соединение базы данных с менеджером контекста Фото Taylor Vick на … Теги с Python.

Автоматически закрытие соединения базы данных с менеджером контекста

фото Тейлор Вик на Бессмысленно

Если вы не знаете, какой контекстный менеджер рекомендую вам прочитать о них. Дэн Баденс написал хорошую статью. Но так как вы здесь, почему бы не читать Мой пост ?

Сейчас ничего особенного, чтобы написать курсор. Вам нужен драйвер и учетные данные для подключения к базе данных. В этом примере я буду использовать драйвер 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”