如何覆盖游标上的 psycopg2 tzinfo_factory
How to override psycopg2 tzinfo_factory on cursors
因此,由于 [原因],我正在考虑覆盖由 pyscopg2 设置的 tzinfo classes。我 认为 这将是一个在 cursor
class 上覆盖 tzinfo_factory
的简单案例。但是,这似乎不起作用。
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;
您必须传递 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__)
returns:
psycopg2.tz.FixedOffsetTimezone(offset=120, name=None)
<class '__main__.MyFixedOffsetTimezone'>
因此,由于 [原因],我正在考虑覆盖由 pyscopg2 设置的 tzinfo classes。我 认为 这将是一个在 cursor
class 上覆盖 tzinfo_factory
的简单案例。但是,这似乎不起作用。
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;
您必须传递 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__)
returns:
psycopg2.tz.FixedOffsetTimezone(offset=120, name=None)
<class '__main__.MyFixedOffsetTimezone'>