Как переопределить 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'>