Заводские параметры курсора не имеют никакого эффекта - PullRequest
0 голосов
/ 16 мая 2018

У меня есть база данных class вроде:

rlock = RLock()
class PostgresDB:
    host = Settings.DB_HOST
    name = Settings.DB_NAME
    username = Settings.DB_USERNAME
    pwd = Settings.DB_PWD

    def __init__(self):
        self.con = None

    def _create_connection(self):
        if self.con is None or self.con.closed:
            self.con = psycopg2.connect("host={h} dbname={n} user={u} password={p}".format(
                h=self.host, n=self.name, u=self.username, p=self.pwd,
                cursor_factory=RealDictCursor))

    @contextlib.contextmanager
    def reading_cursor(self, sql, params=None):
        rlock.acquire()
        self._create_connection()
        try:
            cur = self.con.cursor()
            cur.execute(sql, params)
            yield cur
        except DatabaseError as e:
            traceback.print_exc()
            yield Exception()
        finally:
            self.con.close()
        rlock.release()

    @contextlib.contextmanager
    def writing_cursor(self, sql, params=None):
        rlock.acquire()
        self._create_connection()
        try:
            cur = self.con.cursor()
            cur.execute(sql, params)
            yield cur
            self.con.commit()
        except DatabaseError as e:
            traceback.print_exc()
            yield Exception()

        finally:
            self.con.close()
            rlock.release()

Обратите внимание, что я явно запрашиваю RealDictCursor. Однако, когда любой запрос выполнен, результатом является список tuples, а не dicts. Я не уверен, что мне не хватает?

1 Ответ

0 голосов
/ 17 мая 2018

Хорошо, это невероятно глупо ... Если вы присмотритесь, вы увидите, что я передал cursor_factory в .format() вместо того, чтобы передать его .connect() ...

...