Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 16, 2019 17:59:50

lifemaker
Зарегистрирован: 2019-10-16
Сообщения: 18
Репутация: +  1  -
Профиль   Отправить e-mail  

Контекст with: AttributeError [решено]

Здравствуйте!
Разбираюсь с контекстными вызовами. Столкнулся с ошибкой, которую не могу уже некоторое время побороть.

Написал свой класс:

 import psycopg2
from psycopg2 import pool
class PgDB:
    """Класс для работы с БД"""
    def __init__(self):
        connection_string = "...тут строка подключения..."
        try:
            self.__pool = psycopg2.pool.ThreadedConnectionPool(1, 10, connection_string)
            self.__conn = self.__pool.getconn()
        except psycopg2.pool.PoolError as e:
            self.__pool = None
            self.__conn = None
            raise(e)
        except Exception as e:
            print(" Unknown error")
            raise(e)
    def __enter__(self):
        return self.__conn
    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type is not None:
            self.__conn.rollback()
        try:
            self.__conn.commit()
        except Exception:
            self.__conn.rollback()
        finally:
            self.__conn.close()
    def execute(self, sqltext='select 1'):
        ps_cursor = self.__conn.cursor()
        ps_cursor.execute(sqltext)
        records = ps_cursor.fetchall()
        ps_cursor.close()
        self.__pool.putconn(self.__conn)
        return records

Вызов вида:
 print(PgDB().execute('select * from objects limit 10'))
работает отлично, но я хочу получить “сахар” в виде контекстного вызова:

 with PgDB() as db:
    a = db.execute('select * from objects limit 10')

И вот тут возвращается ошибка
a = db.execute('select * from “objects” limit 10')
AttributeError: ‘psycopg2.extensions.connection’ object has no attribute ‘execute’
с которой у меня разобрать не получилось. Мне не понятно, почему при таком вызове не находится атрибут - метод. Как правильно это реализовать?

Отредактировано lifemaker (Окт. 17, 2019 15:58:56)

Офлайн

#2 Окт. 16, 2019 19:39:06

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Контекст with: AttributeError [решено]

https://nuancesprog.ru/p/4398/



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

#3 Окт. 17, 2019 15:58:14

lifemaker
Зарегистрирован: 2019-10-16
Сообщения: 18
Репутация: +  1  -
Профиль   Отправить e-mail  

Контекст with: AttributeError [решено]

AD0DE412
https://nuancesprog.ru/p/4398/
Спасибо за ответ! К сожалению я не смог его приметить. Уровни изоляции в данном случае мне не нужны, т.к. в дальнейшем я планирую передавать подключение к произвольному серверу.
Тем неменее вопрос решил сам: дело было в том, что __enter__ возвращал коннектор, а не объект класса. Заменил на
 def __enter__(self):
        return self
и всё заработало.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version