在Python中从SQL的BEGIN; ...; END;块中获取数据

2 投票
2 回答
2103 浏览
提问于 2025-04-15 23:43

我想一次性运行很多个查询,把它们放在 BEGIN;END; 之间。我试了下面这个:

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

但是,我遇到了这个错误:

psycopg2.ProgrammingError: no results to fetch

那我到底该怎么才能用这种方式获取数据呢?

另外,如果我只是把很多个查询排在一起,我只会得到最后一个查询的数据。有没有办法把所有的查询结果都拿到呢?

2 个回答

0

如果你只是用SELECT语句查询一些东西,而且没有任何执行数据修改(DML)之类的功能,那么我认为你不需要特别去创建一个事务。

4

Postgresql其实不支持从一个命令返回多个结果集。如果你把下面的输入传给psql:

BEGIN;
SELECT ...;
END;

它会在客户端把这个拆分开来,实际上执行了三个语句,只有第二个语句会返回一个结果集。

“BEGIN”和“END”是SQL层面的命令,用来开始和结束一个事务。(可能还有更底层的协议可以做到这一点,但我记不清了)。你可能不想直接使用这些命令,而是让你的驱动程序(比如psycopg2)来处理这些。例如,在Perl的DBI中,我在连接时指定AutoCommit=>0,这样它会在我第一个命令之前自动发出一个“BEGIN”;然后在我明确调用$dbh->commit时,它会发出“END”(或者“COMMIT”等)。我想Python的DB-API也差不多,因为其他系统像JDBC也是这样……

撰写回答