2014-09-22 52 views
1

我有一段代碼在服務器上正常工作,並不在其他服務器上運行(Linux服務器)Python的psycopg2錯誤瓦爾功能

import psycopg2,psycopg2.extras 
conn = psycopg2.connect("host=xx.x.x.x dbname=dev user=user password=pass") 
parentId='272' 
dbCur = conn.cursor(cursor_factory=psycopg2.extras.NamedTupleCursor) 
dbCur.execute('select * from "treeItem" where "parentId" = %s order by "order"',(parentId,)) 
for row in dbCur: 
    print type(row) 
    print row.__dict__ 
    vars(row) 
dbCur.close() 
conn.close() 

的服務器錯誤輸出是:

class 'psycopg2.extras.Record' 
Traceback (most recent call last): 
    File "test1.py", line 8, in <module> 
    print row.__dict__ 
AttributeError: 'Record' object has no attribute '__dict__' 

但它工作在其他服務器沒有問題。 相同版本的Python(2.7)和psycopg2 2.5

如何類psycopg2.extras.Record可以__dict__上的環境,而不是其他?

編輯
對蟒蛇2.7.3和psycopg2 2.5工作(DT月PQ3 EXT)
對蟒蛇不工作2.7.5 psycopg2 2.5.1(DT月PQ3 EXT)

+1

您是否確定您在兩種環境中都具有相同版本的psycopg2?如果'Record'對象在更高版本中具有'__slots__'屬性,則實例不會具有'__dict__'屬性。 – 2014-09-22 17:29:16

+0

事實上,'NamedTupleCursor'是你的提示:'namedtuple'對象使用'__slots__'。 – 2014-09-22 17:31:09

+0

@MartijnPieters:那該不該失敗? 'nametuple('Point',['x','y'])(1,2).__ dict__' – 2014-09-22 17:34:40

回答

2

您使用的是psycopg2.extras.NamedTupleCursor,其產生由collections.namedtuple() class factory產生的類的實例。這些類使用__slots__來限制它們的內存使用。

通常,__slots__的類沒有__dict__屬性。但是,在Python 2.7.3中增加了一個__dict__屬性(請參閱revision 26d5f022eb1a),具體來說就是支持vars()的使用。 A later change從Python 2.7.5中再次刪除了支持,然後是readded for Python 2.7.6。該物業充當代理,呼叫namedtuple._asdict()產生OrderedDict對象。

您有一個沒有該屬性的Python 2.7.x版本;例如2.7,2.7.1,2.7.2或2.7.5中的一個。您可以通過調用namedtuple._asdict() method來解決此問題:

for row in dbCur: 
    print type(row) 
    print row._asdict() 
+0

另一種可能的解決方法是使用['psycopg2.extras.RealDictCursor'](http://initd.org/psycopg/docs/extras.html#psycopg2.extras.RealDictCursor)。這樣做的一個副作用是行不能再使用整數索引進行索引。 – 2014-09-22 18:19:37