0

以下の python コードを使用して、にvalue基づいてpostgres DB 列を更新していIdます。このループは何千ものレコードに対して実行する必要があり、時間がかかります。

各行をループする代わりに、データフレーム値の配列を渡す方法はありますか?

 for i in range(0,len(df)):
        QUERY=""" UPDATE "Table" SET "value"='%s' WHERE "Table"."id"='%s'
            """ % (df['value'][i], df['id'][i])
        cur.execute(QUERY)
        conn.commit()
4

1 に答える 1

0

PostgreSQL との通信に使用するライブラリによって異なりますが、通常、一括挿入はCOPY FROMコマンドを使用するとはるかに高速です。

psycopg2 を使用する場合は、次のように簡単です。

cursor.copy_from(io.StringIO(string_variable), "destination_table", columns=('id', 'value'))

string_variableはタブと改行で区切られたデータセットのようです1\tvalue1\n2\tvalue2\n

パフォーマンスの高い一括更新を実現するには、次のようにします。

  1. 一時テーブルを作成します: CREATE TEMPORARY TABLE tmp_table;;

  2. copy_fromでレコードを挿入します。

  3. UPDATE destination_table SET value = t.value FROM tmp_table t WHERE id = t.idクエリまたはその他の優先構文で宛先テーブルを更新するだけです

于 2016-09-19T22:37:55.860 に答える