2017-07-01 17 views
1

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

答えて

関連する問題