2017-09-22 10 views
1

ETLアプリケーションとして機能するWeb UIを構築しました。これにより、大量のレコードを含むCSVファイルとTSVファイルを選択できるようになり、PostgreSQLデータベースに挿入しようとしています。すでによくコメントされているように、このプロセスはかなり遅いです。いくつかの研究の後、UNNEST関数を使用するのが私の答えになるように見えましたが、実装に問題があります。正直なところ、Pythonでデータ処理を研究しているときに通常行っていたように、私はウォークスルーのチュートリアルを見つけられませんでした。psymopg2でUnnestを使用する

私はそれらを保存するとここ(後の関数で使用される)SQL文字列です:

salesorder_write = """ 
    INSERT INTO api.salesorder (
    site, 
    sale_type, 
    sales_rep, 
    customer_number, 
    shipto_number, 
    cust_po_number, 
    fob, 
    order_number 
) VALUES (
    UNNEST(ARRAY %s) 

「」」

私はそうのようなタプルのリストと一緒にこの文字列を使用します。

for order in orders: 
     inputs=(
      order['site'], 
      order['sale_type'], 
      order['sales_rep'], 
      order['customer_number'], 
      order['shipto_number'], 
      order['cust_po_number'], 
      order['fob'], 
      order['order_number'] 
     ) 
     tup_list.append(inputs) 
cur.execute(strSQL,tup_list) 

これは私にエラーNot all arguments converted during string formattingを与えます。私の最初の質問はどのように私のタプルのリストを渡すことができるように私のSQLを構造化する必要があります私の2番目は、構造はほぼ同じですか?

答えて

1

unnestが今よりも優れていない(Psycopg 2.7以降)execute_values正準:

from psycopg2.extras import execute_values 
orders = [ 
    dict (
     site = 'x', 
     sale_type = 'y', 
     sales_rep = 'z', 
     customer_number = 1, 
     shipto_number = 2, 
     cust_po_number = 3, 
     fob = 4, 
     order_number = 5 
    ) 
] 
salesorder_write = """ 
    insert into t (
     site, 
     sale_type, 
     sales_rep, 
     customer_number, 
     shipto_number, 
     cust_po_number, 
     fob, 
     order_number 
    ) values %s 
""" 
execute_values (
    cursor, 
    salesorder_write, 
    orders, 
    template = """(
     %(site)s, 
     %(sale_type)s, 
     %(sales_rep)s, 
     %(customer_number)s, 
     %(shipto_number)s, 
     %(cust_po_number)s, 
     %(fob)s, 
     %(order_number)s 
    )""", 
    page_size = 1000 
) 
+0

非常に興味深いです。パフォーマンス指標を示すベンチマークはありますか? – RyanM

+0

パフォーマンスは目立って改善されましたが、私が望んでいたほどではありませんでした。私の問題は実際にはPostgreSQLサーバからの応答を待っていることに気がつきました。私は順番に複数のINSERTを実行するカスタムINSERTルールを持つビューに書き込んでいます。私はマルチスレッドアプローチを使って研究します。 – RyanM

関連する問題