これらの接続を使用して、SQLAlchemyを回避できます。これはかなり直感的ではないように聞こえますが、通常の挿入よりもはるかに高速になります(ORMを削除して、executemany
などで一般的なクエリを実行した場合でも )。生のクエリを使用しても挿入は遅くなりますが、COPY
が表示されます。 スピードアップする方法で何度か言及されていますPostgreSQLでの挿入パフォーマンス
。この場合、以下のアプローチに対する私の動機は次のとおりです。
-
COPY
を使用するINSERT
の代わりに - Pandasがこの操作の正しいSQLを生成することを信頼しないでください(ただし、IljaEveriläが指摘しているように、このアプローチは実際にはV0.24でパンダに追加 )
- 実際のファイルオブジェクトを作成するためにデータをディスクに書き込まないでください。すべてをメモリに保存します
cursor.copy_from()
を使用した推奨アプローチ
:
import csv
import io
import psycopg2
df = "<your_df_here>"
# drop all the columns you don't want in the insert data here
# First take the headers
headers = df.columns
# Now get a nested list of values
data = df.values.tolist()
# Create an in-memory CSV file
string_buffer = io.StringIO()
csv_writer = csv.writer(string_buffer)
csv_writer.writerows(data)
# Reset the buffer back to the first line
string_buffer.seek(0)
# Open a connection to the db (which I think you already have available)
with psycopg2.connect(dbname=current_app.config['POSTGRES_DB'],
user=current_app.config['POSTGRES_USER'],
password=current_app.config['POSTGRES_PW'],
host=current_app.config['POSTGRES_URL']) as conn:
c = conn.cursor()
# Now upload the data as though it was a file
c.copy_from(string_buffer, 'the_table_name', sep=',', columns=headers)
conn.commit()
これは、実際に挿入を行うよりも桁違いに高速である必要があります。