42

数百万のタプルをデータベースに一括挿入する最も効率的な方法を探しています。Python、PostgreSQL、およびpsycopg2を使用しています。

データベースに挿入する必要があるタルプの長いリストを作成しました。場合によっては、 geometry などの修飾子を使用しますSimplify

それを行う単純な方法は、ステートメントのリストを文字列でフォーマットすることですがINSERT、私が読んだ他の方法が 3 つあります。

  1. パラメトリック挿入にpyformatバインド スタイルを使用する
  2. executemanyタプルのリストでの使用、および
  3. 結果をファイルに書き込み、 を使用しCOPYます。

最初の方法が最も効率的であるように思われますが、正しく行う方法を教えてくれる洞察とコード スニペットをいただければ幸いです。

4

9 に答える 9

15

ええ、COPY はサーバーからのみ読み取るため、サーバーのハード ドライブ (アプリが実行されているドライブではない) にファイルを書き込むことができる場合は、COPY に投票します。

于 2010-02-16T09:41:02.043 に答える
8

私の経験executemanyでは、自分で多くの挿入を実行するよりも速くはありません。最速の方法は、INSERT自分で多くの値を持つ単一をフォーマットすることです。将来的executemanyには改善されるかもしれませんが、今のところは非常に遅いです

a をサブクラス化しlist、append メソッドをオーバーロードするので、リストが特定のサイズに達したら、INSERT をフォーマットして実行します

于 2014-02-02T12:14:24.060 に答える
7

新しいアップサートライブラリを使用できます:

$ pip install upsert

(最初に行う必要があるかもしれませんpip install decorator

conn = psycopg2.connect('dbname=mydatabase')
cur = conn.cursor()
upsert = Upsert(cur, 'mytable')
for (selector, setter) in myrecords:
    upsert.row(selector, setter)

のようなオブジェクトはどこにselectorありますdict{'name': 'Chris Smith'}setterdict{ 'age': 28, 'state': 'WI' }

カスタムのINSERT[/UPDATE]コードを記述し、それを...で直接実行するのとほぼpsycopg2同じくらい高速であり、行がすでに存在する場合は爆発しません。

于 2012-09-27T01:27:02.230 に答える
3

SQLalchemy を使用している人は誰でも、次のように use_batch_mode=True でエンジンを初期化するときに、executemany の代わりに psycopg2.extras.execute_batch() を使用する一括挿入のサポートを追加した 1.2 バージョンを試すことができます。

engine = create_engine(
    "postgresql+psycopg2://scott:tiger@host/dbname",
    use_batch_mode=True)

http://docs.sqlalchemy.org/en/latest/changelog/migration_12.html#change-4109

次に、誰かが SQLalchmey を使用する必要があり、sqla と psycopg2 のさまざまな組み合わせを試して、SQL を一緒に送信する必要はありません。

于 2018-01-02T02:06:31.173 に答える
2

@Clodoaldo Netoの同様の質問への回答から学んだように、いくつかのテストの後、unnestは非常に高速なオプションであることが多いよう です。

data = [(1, 100), (2, 200), ...]  # list of tuples

cur.execute("""CREATE TABLE table1 AS
               SELECT u.id, u.var1
               FROM unnest(%s) u(id INT, var1 INT)""", (data,))

ただし、データが非常に大きい場合は注意が必要です。

于 2015-12-31T09:18:01.400 に答える
1

1 つ目と 2 つ目は、別々ではなく一緒に使用されます。ただし、サーバーがすべてのハードワークを行うため、3 番目の方法が最も効率的です。

于 2010-02-16T09:39:15.527 に答える