Việc sử dụng các câu lệnh đã chuẩn bị sẵn với MySQL bằng Python được giải thích, ví dụ:tại http://zetcode.com/db/mysqlpython/ - tìm trong trang đó để biết Prepared statements
.
Trong trường hợp của bạn, đó sẽ là, ví dụ:
sql = ('INSERT INTO {} (date, time, tag, power) VALUES '
'(%s, %s, %s, %s)'.format(self.db_scan_table))
và sau đó, "trong vòng lặp" như bạn đặt:
self.cursor.execute(sql, (d, t, tag, power))
mà không cần định dạng chuỗi nào nữa - MySQLdb
mô-đun thay mặt bạn chuẩn bị và thực thi các phần (và có thể lưu vào bộ nhớ cache mọi thứ để tránh lặp lại công việc một cách không cần thiết, v.v., v.v.).
Hãy xem xét, tùy thuộc vào bản chất của "vòng lặp" mà bạn đề cập, rằng có thể một lệnh gọi đến .execute_many
(với một chuỗi các bộ giá trị làm đối số thứ hai) có thể thay thế toàn bộ vòng lặp (trừ khi bạn cần xử lý nhiều hơn trong vòng lặp đó ngoài việc chỉ chèn dữ liệu vào DB).
Đã thêm:một giải pháp thay thế tốt hơn hiện nay có thể là sử dụng Connector/Python
của riêng mysql và prepare=True
rõ ràng trong .cursor()
factory - xem http:// dev .mysql.com / doc / connector-python / en / connector-python-api-mysqlcursorprepared.html
. Điều này cho phép bạn có một con trỏ cụ thể về các câu lệnh được chuẩn bị (với giao thức nhị phân "hiệu quả hơn sử dụng PREPARE và EXECUTE", theo trang mysql.com đó) và một con trỏ khác cho các câu lệnh không được chuẩn bị tốt hơn; "rõ ràng tốt hơn là ngầm hiểu" là sau tất cả một trong những nguyên tắc trong "The Zen of Python" (import this
từ một lời nhắc tương tác để đọc tất cả các nguyên tắc đó). mysqldb
thực hiện mọi việc một cách ẩn ý (và có vẻ như phiên bản nguồn mở hiện tại không sử dụng các câu lệnh đã chuẩn bị) không thể là một kiến trúc tốt như Connector/Python
rõ ràng hơn.