我正在尝试将
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
我做的事情明显是错误的吗?我怎样才能开始调试这个,我不知道从哪里开始,因为它连接得很好?
cursor.execute
准备并执行查询,但不获取任何数据,因此 None
是预期的返回类型。如果你想检索查询结果,你必须使用 fetch*
方法之一:
print cur.fetchone()
rows_to_fetch = 3
print cur.fetchmany(rows_to_fetch)
print cur.fetchall()
注意,正如文档中所述: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应该更喜欢简洁的代码,只要它不影响理解,而且,恕我直言,这感觉更自然。
游标的
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
您没有阅读有完美示例的基本文档
http://initd.org/psycopg/docs/cursor.html
>>> cur.execute("SELECT * FROM test WHERE id = %s", (3,))
>>> cur.fetchone()
(3, 42, 'bar')
如果您正在查找操作结果,例如选择/删除/插入了多少行等。你可以做这样的事情:
>>> import psycopg2
>>> conn = psycopg2.connect("dbname='postgres' user='postgres' host='localhost'")
>>> cur = conn.cursor()
>>> cur.execute("select * from foos;")
>>> print(cur.statusresults)
>>> cur.execute("select * from foos")
>>> print(cur.statusresults)
>>> cur.execute("select name from foos")
>>> print(cur.statusresults)
>>> cur.execute("select f.name from foos f")
>>> print(cur.statusresults)