Psycopg2 не возвращает результаты

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

Мой db работает и определенно имеет в нем таблицу:

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)

Мой код python подключается к этой базе данных, но независимо от того, какой запрос я запускаю, я получаю 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

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

Ответ 1

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

print cur.fetchone()

rows_to_fetch = 3
print cur.fetchmany(rows_to_fetch)

print cur.fetchall()

Ответ 2

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

Следовательно, так же корректно писать:

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

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

Ответ 3

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

Примеры:

>>> # 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

Ответ 4

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

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

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