18

我正在尝试使用psycopg2仅在本地计算机上运行的 postgresql 数据库,无论我尝试什么,它都无法返回结果。似乎可以正常连接到数据库,因为如果我更改任何配置参数都会引发错误,但是,当我运行看似有效且值得结果的查询时,我什么也得不到。

我的数据库正在运行,并且其中肯定有一个表:

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

我在做一些明显错误的事情吗?我怎样才能开始调试这个,我不知道从哪里开始,因为它连接得很好?

4

4 回答 4

25

cursor.execute准备并执行查询,但不获取任何数据,因此None是预期的返回类型。如果要检索查询结果,则必须使用以下fetch*方法之一:

print cur.fetchone()

rows_to_fetch = 3
print cur.fetchmany(rows_to_fetch)

print cur.fetchall()
于 2013-09-30T15:56:48.977 回答
4

游标的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
于 2013-09-30T16:07:02.317 回答
4

请注意,正如它在文档中所说:http: //initd.org/psycopg/docs/cursor.html “游标对象是可迭代的,因此,可以使用对象本身,而不是在循环中显式调用 fetchone()”

因此,这样写同样有效:

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

没有显式调用 fetchone()。我们 pythonistas 应该更喜欢简洁的代码,只要它不影响理解,而且,恕我直言,这感觉更自然。

于 2014-03-07T09:23:54.823 回答
2

您没有阅读具有完美示例的基本文档

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

>>> cur.execute("SELECT * FROM test WHERE id = %s", (3,))
>>> cur.fetchone()
(3, 42, 'bar')
于 2013-09-30T15:56:51.027 回答