SQL получает данные из BEGIN; ...; КОНЕЦ; блок в питоне

2

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

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

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

psycopg2.ProgrammingError: no results to fetch

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

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

Теги:
sqlobject

2 ответа

4
Лучший ответ

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

BEGIN;
SELECT ...;
END;

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

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

  • 0
    Ах хорошо. я только хотел сделать это быстрее, но так как это делает три поездки в любом случае, это не имеет значения
0

Если вы просто выбираете что-то, и у вас нет функции, которая выполняет любой DML или тому подобное, вам не нужно делать явную транзакцию по любой причине, о которой я знаю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню