2017-05-03 57 views
0

因此,由于[原因],我正在重写由pyscopg2设置的tzinfo类。我想想到这将是一个简单的例子,覆盖cursortzinfo_factory。但是,这似乎并不奏效。如何在游标上覆盖psycopg2 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实现的成员和上级蟒蛇互动的根本误解的结果? (还是我是一个完整的pleb?)版本:python 3.5.2在psycopg2 2.6.2测试2.7.1

我已经通过代码拖网,并且它似乎光标(psycopg/typecast_datetime.c被引用tzinfo_factory: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'> 
+0

(我修复了cursor_factory缺少的passthrough,然后复制了另一个版本的示例。我已经在我的例子中解决了这个问题,因为它不是真正的问题,并且在编写我的示例时出现错误。) 这确实解决了这个问题,但是您知道它为什么解决它吗?为什么将'tzinfo_factory'设置为类属性不起作用,但将其设置为实例属性呢? –

+0

这只是一个假设,我从未见过使用类属性的psycopg2(以及cx_Oracle)。 –