Как переопределить psycopg2 tzinfo_factory на курсорах

Поэтому из-за [причин] я смотрю на переопределение классов tzinfo, которые устанавливаются pyscopg2. Я думал, что это будет простой случай переопределения tzinfo_factory на cursor учебный класс. Тем не менее, это не похоже на работу.

import psycopg2
from psycopg2.extensions import cursor
from psycopg2.tz import FixedOffsetTimezone

class MyFixedOffsetTimezone(FixedOffsetTimezone):
    pass

class MyCursorFactory(cursor):
    tzinfo_factory = MyFixedOffsetTimezone
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

conn = psycopg2.connect('', cursor_factory=MyCursorFactory)
cursor = conn.cursor()
cursor.execute("select now()")
results = cursor.fetchall()
print(results[0][0].tzinfo)
print(results[0][0].tzinfo.__class__)

Еще даст тебе

$ python3 example.py 
psycopg2.tz.FixedOffsetTimezone(offset=60, name=None)
<class 'psycopg2.tz.FixedOffsetTimezone'>

Является ли это результатом моего фундаментального недопонимания того, как взаимодействуют члены реализации C и Python более высокого уровня? (или я полный плеб?) версии: python 3.5.2 проверено в psycopg2 2.6.2 а также 2.7.1

Я просмотрел код, и он, кажется, ссылается tzinfo_factory на курсоре (psycopg/typecast_datetime.c:typecast_PYDATETIME_cast строка 140 @ 2.7.1)

tzinfo_factory = ((cursorObject *)curs)->tzinfo_factory;

1 ответ

Решение

Вы должны пройти cursor_factory=... и назначить MyFixedOffsetTimezone в MyCursorFactory:

class MyFixedOffsetTimezone(FixedOffsetTimezone):
    pass

class MyCursorFactory(cursor):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.tzinfo_factory = MyFixedOffsetTimezone

conn = psycopg2.connect('...')
cursor = conn.cursor(cursor_factory=MyCursorFactory)
cursor.execute("select now()")
results = cursor.fetchall()
print(results[0][0].tzinfo)
print(results[0][0].tzinfo.__class__)

возвращает:

psycopg2.tz.FixedOffsetTimezone(offset=120, name=None)
<class '__main__.MyFixedOffsetTimezone'>
Другие вопросы по тегам