Trước khi bắt đầu bài viết về kết nối SQL Server với Python, tôi khuyên những người mới học nên kiểm tra khái niệm cơ bản về Python từ trang web Python hoặc bất kỳ trang web nào khác được đề xuất trên Google. Chúng ta có thể kết nối Python với nhiều loại cơ sở dữ liệu khác nhau, bao gồm MySQL, SQL Server, Oracle và Sybase, v.v. Vì vậy, trong hướng dẫn này, tôi sẽ giải thích cách chúng ta có thể kết nối với SQL Server. Để kết nối với bất kỳ cơ sở dữ liệu nào, chúng tôi chủ yếu làm theo 4 bước
- Nhập mô-đun API [tương tự như Không gian tên được sử dụng trong. Bọc lưới]
- Thiết lập kết nối với cơ sở dữ liệu bằng cách sử dụng hàm tạo kết nối. kết nối [thông số. ] Cần một số tham số như-Trình điều khiển, Máy chủ, Cơ sở dữ liệu, Uid, Trình điều khiển Pwd- Chủ yếu phụ thuộc vào cơ sở dữ liệu bạn đang sử dụng. Theo cơ sở dữ liệu, trình điều khiển này sẽ thay đổi.
Server- Đây là tên của máy chủ chứa cơ sở dữ liệu.
Cơ sở dữ liệu- Tên cơ sở dữ liệu.
Uid- Đây là userId cho cơ sở dữ liệu của bạn.
Pwd- Đây là mật khẩu cho cơ sở dữ liệu của bạn. - Truyền Truy vấn của bạn trong một đối tượng lệnh
- Tạo một con trỏ để thực hiện Truy vấn.
- Đóng kết nối [tùy chọn]
Bây giờ, hãy mở Visual Studio. Tạo một Dự án mới, sau đó chuyển đến Mẫu Python như sau
Bây giờ, hãy chuyển đến Môi trường Python. Kiểm tra Pipiodbc trong Môi trường Python, như sau. Cài đặt hoặc cập nhật nó.
Bây giờ, hãy mở ứng dụng Python và viết đoạn mã sau.
- nhập pypyodbc
- kết nối = pypyodbc. connect['Trình điều khiển={Máy chủ SQL};Máy chủ=Debendra;Cơ sở dữ liệu=CodeX;uid=sa;pwd=123']
- print["Đã kết nối. "]
- sự liên quan. đóng lại[]
Bây giờ mình sẽ viết code để nhập dữ liệu từ người dùng và lưu dữ liệu vào cơ sở dữ liệu như sau
Giả sử bạn đã lấy một thứ gì đó từ web hoặc bạn có một tập dữ liệu mà bạn đã lập mô hình bằng Python và bây giờ bạn muốn lưu trữ nó ở đâu đó. Gì?
Dưới đây là các bước về cách chèn dữ liệu từ Python vào SQL Server. Nếu bạn muốn biết cách làm việc theo cách khác [từ máy chủ SQL sang Python [Pandas DataFrame], hãy xem bài đăng này
Các bước thực hiện như sau
Kết nối với máy chủ SQL
Tạo Khung dữ liệu Pandas [hư cấu] [df]
Nhập dữ liệu từ df vào bảng trong SQL Server
Trong ví dụ này, tôi lấy một bảng hiện có từ SQL Server, tải nó vào DataFrame và đặt lại ngay khi nó đến từ. Vâng, điều này có nghĩa là các bản ghi trùng lặp [lặp đi lặp lại], nhưng bạn hiểu rõ
Gần đây tôi đã cố gắng tải các bộ dữ liệu lớn vào cơ sở dữ liệu SQL Server bằng Python. Thông thường, để tăng tốc độ chèn với pyodbc
, tôi có xu hướng sử dụng tính năng cursor.fast_executemany = True
để tăng tốc độ chèn đáng kể. Tuy nhiên, hôm nay tôi gặp phải một lỗi kỳ lạ và bắt đầu tìm hiểu sâu hơn về cách thức hoạt động của fast_executemany
Lược đồ khung dữ liệu và bảng SQL Server của tôi
Khi tôi đang cố tải dữ liệu của mình vào SQL Server, tôi gặp lỗi. “Lỗi khi chuyển đổi kiểu dữ liệu varchar thành số. ”
Lỗi này cực kỳ khó hiểu đối với tôi vì các loại dữ liệu trong khung dữ liệu Pandas của tôi hoàn toàn khớp với các loại được xác định trong bảng SQL Server. Cụ thể, dữ liệu mà tôi đang cố tải là một chuỗi thời gian có dấu thời gian và các cột đo lường + một số cột siêu dữ liệu
My dataframe schema:
summertime bool
time datetime64[ns]
unique_id object
measurement float64
entered datetime64[ns]
updated datetime64[ns]
Bảng SQL Server có một lược đồ tương tự như thế này
Lược đồ của bảng máy chủ SQL
Nếu bạn nhìn vào các loại dữ liệu, chúng hoàn toàn khớp với nhau
"Lỗi khi chuyển đổi kiểu dữ liệu varchar thành số"Để tải nhanh dữ liệu này vào cơ sở dữ liệu SQL Server, tôi đã chuyển đổi khung dữ liệu Pandas thành danh sách các danh sách bằng cách sử dụng
ProgrammingError: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server] Error converting data type varchar to numeric. [SQLExecute]
0. Để nhập dữ liệu của tôi vào phiên bản cơ sở dữ liệu, tôi đã tạo- đối tượng kết nối với phiên bản cơ sở dữ liệu SQL Server
- đối tượng con trỏ [từ đối tượng kết nối]
- và câu lệnh
ProgrammingError: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server] Error converting data type varchar to numeric. [SQLExecute]
1
Lưu ý rằng trên dòng 14, chúng tôi sử dụng tính năng cursor.fast_executemany = True
. Việc thực thi tập lệnh đã gây ra lỗi sau cho tôi [với phiên bản.
ProgrammingError: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server] Error converting data type varchar to numeric. [SQLExecute]
3]ProgrammingError: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server] Error converting data type varchar to numeric. [SQLExecute]
Tại sao
ProgrammingError: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server] Error converting data type varchar to numeric. [SQLExecute]
4 lại cố gắng chuyển đổi thứ gì đó từ ProgrammingError: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server] Error converting data type varchar to numeric. [SQLExecute]
0 thành ProgrammingError: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server] Error converting data type varchar to numeric. [SQLExecute]
1?. Khi tôi nhận xét dòng 14 để sử dụng ProgrammingError: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server] Error converting data type varchar to numeric. [SQLExecute]
2 mà không có tính năng fast_executemany
, tập lệnh vẫn hoạt động tốt. Tôi đã có thể chèn dữ liệu của mình mà không gặp bất kỳ sự cố nàoVấn đề duy nhất là không có fast_executemany
, nó chậm
ProgrammingError: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server] Error converting data type varchar to numeric. [SQLExecute]
5Theo Pyodbc Wiki [1]
fast_executemany
có thể nâng cao hiệu suất của các hoạt động củaProgrammingError: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server] Error converting data type varchar to numeric. [SQLExecute]
7 bằng cách giảm đáng kể số lần quay lại máy chủ
Đây là lý do chính tại sao tôi muốn sửa lỗi này. Theo sự cố Github từ kho lưu trữ pyodbc
[2], nội bộ pyodbc
chuyển tất cả các giá trị thập phân dưới dạng chuỗi do một số khác biệt và lỗi liên quan đến dấu thập phân được sử dụng bởi các trình điều khiển cơ sở dữ liệu khác nhau. Điều này có nghĩa là khi dữ liệu của tôi có giá trị pyodbc
0 hoặc pyodbc
1, cả hai giá trị đó có thể không được chấp nhận vì loại dữ liệu SQL Server của tôi được chỉ định là pyodbc
2. Ngoài ra, pyodbc
cần chuỗi thay vì số float, vì vậy giá trị đúng sẽ là pyodbc
4 i. e. một chuỗi [không float. ] với đúng ba số sau dấu phẩy
Vì vậy, giải pháp của tôi đã rút gọn để thêm dòng này
Dòng này chỉ chuyển đổi số float thành chuỗi biểu thị các số có chính xác ba dấu thập phân
Giải pháp “lạ” giúp tôi sử dụng “fast_executemany” với float Lợi ích của việc sửa lỗi “fast_executemany”
Sau khi khắc phục sự cố, tập lệnh chạy nhanh hơn 100 lần so với chạy mà không có dòng 14 [cursor.fast_executemany = True
]. Lưu ý rằng nó rất nhanh vì nó tải toàn bộ dữ liệu vào bộ nhớ trước khi tải nó vào SQL Server, vì vậy hãy cân nhắc việc tải theo khối nếu bạn gặp lỗi hết bộ nhớ
Tóm lại, tôi đã có thể sửa lỗi "Lỗi chuyển đổi kiểu dữ liệu varchar thành số" bằng cách chuyển đổi cột float của tôi thành chuỗi có cùng số dấu thập phân như được xác định trong bảng SQL Server. Tôi khá ngạc nhiên là pyodbc
không xử lý vấn đề đó bên trong [hoặc có thể nó đã được sửa trong các phiên bản Pyodbc gần đây hơn?]