2016-05-03 25 views
5

在python腳本中,我需要在一個數據源上運行查詢,並將該查詢的每一行插入到不同數據源的表中。我通常會用一個帶有tsql鏈接服務器連接的插入/選擇語句執行此操作,但是我沒有鏈接到此特定數據源的鏈接服務器連接。基本的pyodbc批量插入

我無法找到一個簡單的pyodbc這個例子。這裏是我怎麼做,但我猜在循環內執行插入語句是非常緩慢的。

result = ds1Cursor.execute(selectSql) 

for row in result: 
    insertSql = "insert into TableName (Col1, Col2, Col3) values (?, ?, ?)" 
    ds2Cursor.execute(insertSql, row[0], row[1], row[2]) 
    ds2Cursor.commit() 

是否有更好的批量方式插入記錄與pyodbc?或者這是一個相對有效的方式來做到這一點。我使用的是SqlServer 2012,以及最新的pyodbc和python版本。

回答

7

處理此問題的最佳方法是使用pyodbc函數executemany

ds1Cursor.execute(selectSql) 
result = ds1Cursor.fetchall() 


ds2Cursor.executemany('INSERT INTO [TableName] (Col1, Col2, Col3) VALUES (?, ?, ?)', result) 
ds2Cursor.commit() 
+8

只是說明,executemany實際上並沒有真正做bulkinsert。在場景的後面,插入1仍然是1.它真的是一個包裝,允許數據更加pythonically來源。這SO帖子提出了一個適當的bulkinsert。 http://stackoverflow.com/questions/29638136/how-to-speed-up-with-bulk-insert-to-ms-server-from-python-with-pyodbc-from-csv – casbby

4

這是一個可以批量插入SQL Server數據庫的函數。

import pypyodbc 
import contextlib 

def bulk_insert(table_name, file_path): 
    string = "BULK INSERT {} FROM '{}' (WITH FORMAT = 'CSV');" 
    with contextlib.closing(pypyodbc.connect("MYCONN")) as conn: 
     with contextlib.closing(conn.cursor()) as cursor: 
      cursor.execute(string.format(table_name, file_path)) 
     conn.commit() 
     conn.close() 

這絕對有效。由於更新,最好使用pypyodbc而不是pyodbc。

+1

這是正確的答案,並應該被接受。 executemany方法不能替代批量插入的速度。值得注意的是,如果你想從迭代器中執行批量插入而不是SQL Server本身的文件,那麼ctds驅動程序是一個選項。 https://pypi.python.org/pypi/ctds/ – Kerr

+0

只檢出您提供的鏈接。我認爲它看起來非常好。要試一試。謝謝。 – Naufal