SQL从BEGIN中获取数据; ...;结束;在python中阻止

时间:2010-06-08 23:17:18

标签: python sql postgresql sqlobject

我想通过将它们放在BEGIN; END;之间来同时运行多个选择查询。我尝试了以下方法:

cur = connection.cursor()
cur.execute("""
BEGIN;
SELECT ...;
END;""")
res = cur.fetchall()

然而,我收到错误:

psycopg2.ProgrammingError: no results to fetch

如何以这种方式实际获取数据?

同样,如果我连续多次选择,我只会从最新的数据中获取数据。有没有办法从所有这些数据中获取数据?

2 个答案:

答案 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之类的功能,那么你不应该因为我所知的任何原因而进行显式交易。