2

の間に配置して、一度に多くのselectクエリを実行したいと思いますBEGIN; END;。私は次のことを試しました:

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

ただし、次のエラーが発生します。

psycopg2.ProgrammingError: no results to fetch

この方法で実際にデータを取得するにはどうすればよいですか?

同様に、連続して多数の選択がある場合、最新のものからのみデータを取得します。それらすべてからデータを取得する方法はありますか?

4

2 に答える 2

4

Postgresqlは、実際には1つのコマンドから複数の結果セットを返すことをサポートしていません。この入力をpsqlに渡す場合:

BEGIN;
SELECT ...;
END;

これをクライアント側に分割し、実際に3つのステートメントを実行し、そのうちの2番目だけが結果セットを返します。

「BEGIN」と「END」は、トランザクションを開始/終了するためのSQLレベルのコマンドです。(これを行うための低レベルのプロトコルがあるかもしれませんが、私は覚えていません)。おそらく直接発行するのではなく、ドライバー(psycopg2)にこれを処理させます。たとえば、PerlのDBIでは、接続時にAutoCommit => 0を指定すると、最初のコマンドの前に暗黙的に「BEGIN」が発行されます。次に、$ dbh-> commitを明示的に呼び出すと、「END」(または「COMMIT」など)になります。JDBCなどの他のシステムも同様に機能するため、PythonのDB-APIはこのように機能すると思います...

于 2010-06-08T23:23:53.387 に答える
0

何かを選択しているだけで、DMLなどを実行する関数がない場合は、私が知っている理由で明示的なトランザクションを実行する必要はありません。

于 2010-06-09T03:20:56.460 に答える