SQL получает данные из BEGIN;...;КОНЕЦ;блок в питоне - PullRequest
2 голосов
/ 09 июня 2010

Я хочу выполнить несколько запросов на выборку, поместив их между BEGIN; END;. Я попробовал следующее:

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

Однако я получаю сообщение об ошибке:

psycopg2.ProgrammingError: no results to fetch

Как я могу получить данные таким образом?

Точно так же, если у меня есть только несколько выборок подряд, я получаю данные только из самого последнего. Есть ли способ получить данные из всех них?

Ответы [ 2 ]

4 голосов
/ 09 июня 2010

Postgresql фактически не поддерживает возврат нескольких наборов результатов из одной команды.Если вы передадите этот ввод в psql:

BEGIN;
SELECT ...;
END;

, он разделит это на стороне клиента и фактически выполнит три оператора, только вторая из которых возвращает набор результатов.

"BEGIN"и «END» - команды уровня SQL для запуска / завершения транзакции.(Для этого может быть протокол более низкого уровня, но я не могу вспомнить).Вы, вероятно, не хотите выдавать их напрямую, а ваш драйвер (psycopg2) справится с этим.Например, в DBI Perl при подключении я указываю AutoCommit => 0, и он неявно выдает «BEGIN» перед моей первой командой;и затем "END" (или "COMMIT" и т. д.), когда я явно вызываю $ dbh-> commit;Я предполагаю, что DB-API Python работает так же, как и другие системы, такие как JDBC ...

0 голосов
/ 09 июня 2010

Если вы просто ВЫБИРАЕТЕ что-то, и у вас нет функции, которая выполняет какой-либо DML или тому подобное, вам не нужно совершать явную транзакцию по любой причине, о которой я знаю.

...