2016-05-03 24 views
5

Bir python komut dosyasında, bir veri kaynağı üzerinde bir sorgu çalıştırmalı ve bu sorgudaki her satırı farklı bir veri kaynağındaki bir tabloya eklemeliyim. Normalde bunu bir tsql bağlantılı sunucu birleşimi olan tek bir ekleme/select deyimi ile yapardım ancak bu belirli veri kaynağına bağlantılı bir sunucu bağlantım yok.basic pyodbc bulk insert

Bunun basit bir podbc örneği bulmakta zorlanıyorum. İşte böyle yaparım ama sanırım bir döngü içinde bir ekleme ifadesi yürütmek oldukça yavaştır.

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() 

Kayıtları podbc ile eklemek daha iyi bir toplu yol var mı? Ya da bu zaten yapmak için nispeten verimli bir yoldur. SqlServer 2012'yi ve en yeni pyodbc ve python sürümlerini kullanıyorum.

cevap

7

Bunu işlemenin en iyi yolu, executemany pyodbc işlevini kullanmaktır.

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


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

Sadece bir not, executemany aslında gerçek bulkinsert yapmaz. Sahnenin arkasında hala 1 ile 1 ekler. Bu gerçekten veri daha pythonically kaynaklı izin vermek için bir sarıcı. Bu SO yazısı uygun bir bulkinsert sunar. http://stackoverflow.com/questions/29638136/how-to-speed-up-with-bulk-insert-to-ms-server-from-python-with-pyodbc-from-csv – casbby

4

Toplu eki SQL Server veritabanına yapabilen bir işlev.

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() 

Bu kesinlikle çalışır. Güncellemeler nedeniyle, pyodbc yerine pypyodbc kullanmak daha iyidir.

+1

Doğru cevap budur, ve böyle kabul edilmelidir. Executemany yöntemi, bulk insert hızının yerine geçmez. Not, SQL Server'ın kendisinde bir dosya yerine bir yineleyiciden toplu bir ekleme yapmak istiyorsanız, ctds sürücüsü bir seçenektir. https://pypi.python.org/pypi/ctds/ – Kerr

+0

Sadece sağladığınız bağlantıyı kontrol ettiniz. Bence çok güzel görünüyor. Denemelisin. Teşekkürler. – Naufal