2

我想通过将它们放在BEGIN; END;. 我尝试了以下方法:

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

但是,我收到错误:

psycopg2.ProgrammingError: no results to fetch

我怎样才能以这种方式实际获取数据?

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

4

2 回答 2

4

Postgresql 实际上不支持从单个命令返回多个结果集。如果将此输入传递给 psql:

BEGIN;
SELECT ...;
END;

它将在客户端拆分并实际执行三个语句,其中只有第二个返回结果集。

“BEGIN”和“END”是用于启动/完成事务的 SQL 级命令。(可能有一个较低级别的协议可以做到这一点,但我不记得了)。您可能不想直接发出它们,而是让您的驱动程序 (psycopg2) 处理它。例如,对于 Perl 的 DBI,我在连接时指定 AutoCommit=>0,它在我的第一个命令之前隐式发出“BEGIN”;当我显式调用 $dbh->commit; 时,然后是“END”(或“COMMIT”等);我猜 Python 的 DB-API 是这样工作的,因为 JDBC 等其他系统也是如此……

于 2010-06-08T23:23:53.387 回答
0

如果您只是 SELECTing 某事并且您没有执行任何 DML 或类似功能的函数,那么您不应该出于我知道的任何原因进行显式事务。

于 2010-06-09T03:20:56.460 回答