2017-05-03 54 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)。 –