Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么查询结果只能使用一次?_Python_Postgresql_Psycopg2 - Fatal编程技术网

Python 为什么查询结果只能使用一次?

Python 为什么查询结果只能使用一次?,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,我不熟悉SQL和psycopg2。我正在玩一些游戏,试图找到如何显示查询结果的方法。我有一个小脚本,在其中连接到数据库并创建一个游标来运行查询 from psycopg2 import connect conn = connect(host="localhost", user="postgres", dbname="portfolio", password="empty") cur = conn.cursor() cur.execute("SELECT * F

我不熟悉SQL和psycopg2。我正在玩一些游戏,试图找到如何显示查询结果的方法。我有一个小脚本,在其中连接到数据库并创建一个游标来运行查询

from psycopg2 import connect

conn = connect(host="localhost", user="postgres", dbname="portfolio",
               password="empty")

cur = conn.cursor()

cur.execute("SELECT * FROM portfolio")

for record in cur:
    print("ISIN: {}, Naam: {}".format(record[0], record[1]))

print(cur.fetchmany(3))

cur.close()
conn.close()
如果我运行这段代码,第一次打印就可以了,但是第二次打印语句返回[]

如果我只运行两个print语句中的一个,每次都会得到一个结果。
有人能解释一下原因吗?

光标在结果上循环,一次返回一个结果。当它把所有的东西都归还后,它就再也回不来了。这与在文件中的行上循环(到达文件末尾后将不再有行)或甚至在列表上循环(在最后一行之后列表中不再有条目)完全相同

如果您想在Python中操作结果,您可能应该将它们读入一个列表,然后您可以随意遍历该列表,或者搜索、排序等,或者完全随机访问

cur.execute("SELECT * FROM portfolio")

result = cur.fetchall()

for record in result:
    print("ISIN: {}, Naam: {}".format(record[0], record[1]))

print(result[0:3]))

游标返回一个迭代器,该迭代器只能产生一次结果
print()
将其排出。@roganjosh:看,情况似乎并非如此。它显示了
for
循环中
print
的一个示例。请告诉我具体位置。我怀疑for循环实际上是在游标上迭代,这很好,因为您要求它生成一次结果。如果列表是可编辑的,您可以在它上面循环,端到端循环任意次数。迭代器更像瀑布;当水从你身边流过时,你可以观察它(这是
print()
),但是没有任何东西(忘记雨水)会把你刚才看到的水放在顶部。真的,你似乎从这里的每个人所说的话中得出了仓促的结论,只是陷入了更深的混乱。除非您对迭代器进行一些研究,否则我们无法在这里提供帮助。如果您能补充一下为什么
for
循环一次返回所有内容,这将很有帮助。@shahkalpesh通常不是这样。值得重新阅读评论和答案,没有人建议这样做。@roganjosh:我不知道你的意思。我的建议是(基于我对python和psycopg的有限知识),为什么为。。。在游标中不是对每个记录都迭代吗?它绝对是这样;你为什么坚持不这样做?当我说iterate时,我的意思是它遍历每条记录并对每条记录执行
print
语句,就像在列表上使用
for
时一样。此外,您的代码执行一个
fetchall
,而OP并没有这样做。我正在寻找一个解释,解释为什么iterable一次就可以排气(当我不使用
fetchall
时)。非常感谢。