2016-05-03 24 views
5

Trong tập lệnh python, tôi cần chạy truy vấn trên một nguồn dữ liệu và chèn từng hàng từ truy vấn đó vào bảng trên nguồn dữ liệu khác. Tôi thường làm điều này với một tuyên bố chèn/chọn đơn với một máy chủ được liên kết với tsql nhưng tôi không có kết nối máy chủ được liên kết với nguồn dữ liệu cụ thể này.Chèn số lượng lớn pyodbc cơ bản

Tôi đang gặp khó khăn khi tìm một ví dụ về pyodbc đơn giản về điều này. Đây là cách tôi sẽ làm điều đó nhưng tôi đoán thực hiện một tuyên bố chèn bên trong một vòng lặp là khá chậm.

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

Có cách nào tốt hơn để chèn bản ghi với pyodbc không? Hay đây là một cách tương đối hiệu quả để làm điều này. Tôi đang sử dụng SqlServer 2012, và các phiên bản pyodbc và python mới nhất.

Trả lời

7

Cách tốt nhất để xử lý việc này là sử dụng hàm pyodbc executemany.

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


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

Chỉ cần một lưu ý, thực thi không thực sự làm bulkinsert đúng sự thật. Đằng sau hiện trường nó vẫn làm chèn 1 của 1. Nó thực sự là một wrapper để cho phép dữ liệu được nguồn gốc pythonically hơn. Bài viết SO này trình bày một bulkinsert thích hợp. http://stackoverflow.com/questions/29638136/how-to-speed-up-with-bulk-insert-to-ms-server-from-python-with-pyodbc-from-csv – casbby

4

Đây là chức năng có thể chèn số lượng lớn vào cơ sở dữ liệu 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() 

Điều này chắc chắn hoạt động. Do cập nhật, tốt hơn là sử dụng pypyodbc thay vì pyodbc.

+1

Đây là câu trả lời đúng, và phải được chấp nhận như vậy. Phương thức thực thi không phải là một thay thế cho tốc độ chèn số lượng lớn. Lưu ý, Nếu bạn muốn thực hiện một số lượng lớn chèn từ một iterator chứ không phải là một tập tin trên bản thân máy chủ SQL, trình điều khiển ctds là một tùy chọn. https://pypi.python.org/pypi/ctds/ – Kerr

+0

Chỉ cần kiểm tra liên kết bạn đã cung cấp. Tôi nghĩ rằng nó trông thực sự tốt. Hãy thử xem. Cảm ơn. – Naufal

Các vấn đề liên quan