SQLAlchemyを使用してPostgreSQL INSERT .. ON UPDATEを実行する方法が見つかりません。 複数の行を使用してデータを一度に処理する方法はありますか?SQLAlchemy INSERT ... ON CONFLICTのPostgreSQLネームスペース
私はパンダのデータフレームからの値でアップサートしよう:
for insert_values in df.to_dict(orient='records'):
insert_statement = sqlalchemy.dialects.postgresql.insert(orders_to_channels).values(insert_values)
upsert_statement = insert_statement.on_conflict_do_update(
constraint='orders_to_channels_pkey',
set_=insert_values
conn.execute(upsert)
これは、行単位で動作し、すべての行が別々に処理されるよう - それは(7000行の20分)ひどく遅い動作します。 この操作を単一のSQL文として実行する方法はありますか?
文の更新部分に{'column_name':'excluded .column_name'}
のようなパラメータを渡す機会を探しています。ここでは、「除外」は文字列値の一部として解析されるのではなく、SQLリテラルとして解析されます。これを行う方法はありますか?期待どおりのように大きなパフォーマンスのアップグレードを参照していない可能性がありますので、
insert_statement = sqlalchemy.dialects.postgresql.insert(orders_to_channels)
upsert_statement = insert_statement.on_conflict_do_update(
constraint='orders_to_channels_pkey',
set_={ 'column_name': insert_statement.excluded.column_name }
)
insert_values = df.to_dict(orient='records')
conn.execute(upsert_statement, insert_values)
なおpsycopg2's executemany()
is essentially equivalent to execute()
in a loop: