2017-09-22 77 views
1

我已經構建了一個Web UI作爲ETL應用程序,允許用戶選擇一些包含大量記錄的CSV和TSV文件,並試圖將它們插入到PostgreSQL數據庫中。正如已經很好地評論的那樣,這個過程有點慢。經過一番研究後,它看起來像使用UNNEST函數將是我的答案,但我在實現它時遇到了麻煩。老實說,我沒有像在Python中研究任何數據處理時那樣找到一個很好的步驟式教程。使用unnest with psycopg2

這裏的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能夠傳遞我的元組列表。我的第二個是,我可以使用現有的字典結構大致相同?

回答

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