我想通过将它们放在BEGIN;
END;
之间来同时运行多个选择查询。我尝试了以下方法:
cur = connection.cursor()
cur.execute("""
BEGIN;
SELECT ...;
END;""")
res = cur.fetchall()
然而,我收到错误:
psycopg2.ProgrammingError: no results to fetch
如何以这种方式实际获取数据?
同样,如果我连续多次选择,我只会从最新的数据中获取数据。有没有办法从所有这些数据中获取数据?
答案 0 :(得分:4)
Postgresql实际上不支持从单个命令返回多个结果集。如果将此输入传递给psql:
BEGIN;
SELECT ...;
END;
它将把它拆分为客户端并实际执行三个语句,只有第二个语句返回结果集。
“BEGIN”和“END”是用于启动/完成事务的SQL级命令。 (这可能是一个较低级别的协议,但我不记得)。你可能不想直接发布它们,而是让你的驱动程序(psycopg2)处理它。例如,使用Perl的DBI,我在连接时指定AutoCommit => 0,它在我的第一个命令之前隐式发出“BEGIN”;然后当我明确调用$ dbh-> commit时,“END”(或“COMMIT”等);我猜Python的DB-API的工作方式与此类似,因为其他系统如JDBC也可以......
答案 1 :(得分:0)
如果你只是选择某个东西并且没有执行任何DML之类的功能,那么你不应该因为我所知的任何原因而进行显式交易。