2013-09-30 4 views
11

Я пытаюсь использовать psycopg2, так как моя база данных postgresql, работающая только на моей локальной машине, не может заставить ее возвращать результаты независимо от того, что я пробую. Кажется, что он подключен к базе данных в порядке, поскольку, если я изменяю любой из параметров конфигурации, он вызывает ошибки, однако, когда я запускаю, казалось бы, правдоподобные и получаю достойные запросы, я ничего не получаю.psycopg2 не возвращает результаты

Мой дб работает, и, безусловно, имеет таблицу в нем:

postgres=# \c 
You are now connected to database "postgres" as user "postgres". 
postgres=# select * from foos; 
    name | age 
---------+----- 
Sarah | 23 
Michael | 35 
Alice | 12 
James | 20 
John | 52 
(5 rows) 

Мой питон код подключается к этой базе данных, но независимо от того, что запрос я бегу, я получаю None:

Python 2.7.3 (default, Apr 10 2013, 06:20:15) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import psycopg2 
>>> conn = psycopg2.connect("dbname='postgres' user='postgres' host='localhost'") 
>>> cur = conn.cursor() 
>>> print cur.execute("select * from foos;") 
None 
>>> print cur.execute("select * from foos") 
None 
>>> print cur.execute("select name from foos") 
None 
>>> print cur.execute("select f.name from foos f") 
None 

Am Я делаю что-то явно неправильно? Как я могу начать отлаживать это, я не знаю, с чего начать, так как он прекрасно соединяется?

+1

http://www.python.org/dev/peps/pep-0249/ – Ryan

ответ

14

cursor.execute готовит и выполняет запрос, но не извлекает данные, поэтому ожидается None тип возвращаемого значения. Если вы хотите, чтобы получить результат запроса, вы должны использовать один из fetch* методов:

print cur.fetchone() 

rows_to_fetch = 3 
print cur.fetchmany(rows_to_fetch) 

print cur.fetchall() 
1

Вы не читали основную документацию, которая имеет прекрасные примеры

http://initd.org/psycopg/docs/cursor.html

>>> cur.execute("SELECT * FROM test WHERE id = %s", (3,)) 
>>> cur.fetchone() 
(3, 42, 'bar') 
3

execute() метод курсор просто выполняет SQL, который вы передаете ему. Затем у вас есть несколько вариантов получения ответов от курсора. Вы можете использовать метод fetchone(), который вернет следующий результат. В случае, когда вы впервые его назовете, вы получите первый результат, второй раз второй результат и так далее. Метод fetchall() возвращает все строки и может использоваться как итератор.

Примеры:

>>> # This is an example of the fetchone() method 
>>> cur.execute("select * from foos") 
>>> # This call will return the first row 
>>> result = cur.fetchone() 
>>> # This call will return the second row 
>>> result = cur.fetchone() 


>>> # This is an example of the fetchall() method 
>>> cur.execute("select * from foos") 
>>> results = cur.fetchall() 
>>> for r in results: 
...  print r 
>>> # Now we'll reset the cursor by re-executing the query 
>>> cur.execute("select * from foos") 
>>> for r in cur.fetchall(): 
...  print r 
5

Обратите внимание, что, как говорится в документации: http://initd.org/psycopg/docs/cursor.html «Курсор объекты итерацию, поэтому, вместо вызова явно fetchone() в цикле, сам объект может быть использован»

Поэтому так же, как действует написать:

>>> cur.execute("select foo, bar from foobars") 
>>> for foo, bar in cur: 
.... print foo, bar 

без явного вызова fetchone(). Предполагается, что мы, питонисты, предпочитаем сложный код, если это не мешает пониманию, и, imho, это кажется более естественным.

+0

В моем случае это не работает ('None' возвращается, и я не могу его повторить). 'fetchall()' отлично работает, но это будет более питонический способ сделать это. – PritishC

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