1

SQLObject を使用して Python からアクセスした PostgreSQL で、カーソルの結果から一時テーブルを作成する方法はありますか?

以前、クエリがあり、クエリから直接一時テーブルを作成しました。その後、その一時テーブルとやり取りする他の多くのクエリがありました。

今はもっと多くのデータがあるので、一度に 1000 行程度しか処理したくありません。CREATE TEMP TABLE ... AS ...しかし、私が見る限り、カーソルからはできません。次のようなことをする唯一のことです:

rows = cur.fetchmany(1000);
cur2 = conn.cursor()
cur2.execute("""CREATE TEMP TABLE foobar (id INTEGER)""")
for row in rows:
    cur2.execute("""INSERT INTO foobar (%d)""" % row)

またはより良い方法はありますか?これは非常に効率が悪いようです。

4

4 に答える 4

1

Postgres はカーソル レコードをレコードごとに読み取り、fetchmany 呼び出しで 1000 個のカーソルを取得してメモリにロードしています。あなたが仕事を求めていることをあなたが本当にどのように期待するのか、私にはわかりません。

パフォーマンスが向上したバージョンでは、これらすべての INSERTS が単一の BEGIN と END でラップされ、1 つのトランザクションになるようにします。

row_number() を介して一時テーブルに列を追加して開始するのではなく、カーソルを並べ替える理由はありますか?

于 2010-06-18T00:18:57.077 に答える
0

私はこれをすることになった:

        sql.execute(connection, """
INSERT INTO blah VALUES %s;""" % (
    ", ".join("(%d)" % hid for hid in hids)))

1000個の個別のインサートの代わりに。まだ良い方法はわかりませんが、これで十分です。

于 2010-08-11T16:37:32.377 に答える
0

私は PostgreSQL を使用していませんが、ストアド プロシージャの結果を挿入するには、次のようにすることを知っています。

INSERT INTO #SHIPINFO
exec TESTDTA.S59RSH05 @SCBILLTO, @INID, @ADRSTYPE

ここから撮影。

だから、あなたは多分似たようなことをすることができます. たぶん、カーソルの結果全体を送信して、次のようにします。

CREATE TEMP TABLE foobar (id INTEGER)
INSERT INTO foobar 'rows'
于 2010-06-17T22:10:02.930 に答える