如何重写游标上的psycopg2 tzinfo_工厂

2024-04-16 17:30:06 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,由于[原因],我考虑重写pyscopg2设置的tzinfo类。我认为这是重写cursor类上的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__)

还是会给你

^{pr2}$

这是不是因为我对C实现的成员和更高层的python交互的基本误解造成的?(或者我是一个完全的平民吗?)版本:python 3.5.2在psycopg22.6.22.7.1中测试

我浏览了代码,它似乎确实在引用光标上的tzinfo_factory(psycopg/typecast_datetime.c:typecast_PYDATETIME_cast line 140@2.7.1)

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

Tags: fromimportinitfactoryargsconncursorresults
1条回答
网友
1楼 · 发布于 2024-04-16 17:30:06

必须传递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__)

退货:

^{pr2}$

相关问题 更多 >