2014-09-22 37 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