2014-09-22 3 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 (дт декабря PQ3 внутр)
Dont работы на питон 2.7.5 psycopg2 2.5.1 (дт разл PQ3 вн)

+1

Как уверены вы, что у вас есть та же версия psycopg2 в обеих средах? Если в последующих версиях объект 'Record' имеет атрибут' __slots__', то экземпляры не будут иметь атрибут '__dict__'. –

+0

На самом деле, 'NamedTupleCursor' - ваш намек здесь:' namedtuple' объекты используют '__slots__'. –

+0

@MartijnPieters: Тогда не должно этого не получиться? 'namedtule ('Point', ['x', 'y']) (1, 2) .__ dict__' –

ответ

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). Побочным эффектом этого было бы то, что строки больше не могут индексироваться с использованием целых индексов. –

Смежные вопросы