Я хочу запустить сразу несколько запросов, поставив их между BEGIN;
END;
. Я попробовал следующее:
cur = connection.cursor()
cur.execute("""
BEGIN;
SELECT ...;
END;""")
res = cur.fetchall()
Однако я получаю сообщение об ошибке:
psycopg2.ProgrammingError: no results to fetch
Как я могу получить данные таким образом?
Аналогично, если у меня есть только несколько выборок подряд, я получаю данные только из последней. Есть ли способ получить данные из всех них?
Postgresql фактически не поддерживает возврат нескольких наборов результатов из одной команды. Если вы передадите этот вход в psql:
BEGIN;
SELECT ...;
END;
он разделит эту клиентскую сторону и фактически выполнит три оператора, только вторая из которых возвращает набор результатов.
"BEGIN" и "END" - это команды уровня SQL для запуска/завершения транзакции. (Для этого может быть протокол нижнего уровня, но я не помню). Вы, вероятно, не хотите выпускать их напрямую, но, скорее, ваш драйвер (psycopg2) справится с этим. Например, с Perl DBI я указываю AutoCommit = > 0 при подключении и он неявно выдает "BEGIN" перед моей первой командой; а затем "END" (или "COMMIT" и т.д.), когда я явно вызываю $dbh- > commit; Я предполагаю, что Python DB-API работает примерно так, так как другие системы, такие как JDBC, тоже...
Если вы просто выбираете что-то, и у вас нет функции, которая выполняет любой DML или тому подобное, вам не нужно делать явную транзакцию по любой причине, о которой я знаю.