Python 为什么查询结果只能使用一次?
我不熟悉SQL和psycopg2。我正在玩一些游戏,试图找到如何显示查询结果的方法。我有一个小脚本,在其中连接到数据库并创建一个游标来运行查询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
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
时)。非常感谢。