Không sử dụng "chuỗi chèn" vào SQL của bạn ngoại trừ những trường hợp nó thực sự không thể thiếu, chẳng hạn như str(DEPT)
ở đây để chọn bảng bạn đang chọn. Đối với mọi trường hợp khác, hãy sử dụng tính năng truyền tham số của Python DB API thay thế - nó sẽ trích dẫn mọi thứ phù hợp cho bạn và tự động bảo vệ bạn trước các cuộc tấn công "SQL injection", trong số những thứ khác. (Đôi khi, nó cũng có thể nhanh hơn).
Vì MySQLdb sử dụng ký hiệu không may %s
đối với các tham số, đây là những gì bạn nên làm (cũng sửa kiểu để tuân thủ PEP8, không bắt buộc nhưng không thể làm tổn hại;-):
conn = MySQLdb.connect(host="localhost", user="user", passwd="pass", db="dbase")
cursor = conn.cursor()
q = 'SELECT * FROM %s WHERE course=%%s AND sec = %%s""" % (DEPT,)
cursor.execute(q, (CLASS, SEC))
%%
s trong định dạng chuỗi tạo ra q
trở thành một %
mỗi khi định dạng, vì vậy q
còn lại hai lần xuất hiện %s
- mà execute
điền gọn gàng với các phiên bản CLASS
được định dạng chính xác và SEC
. Tất cả str
cuộc gọi dư thừa, v.v.
Ngoài ra, nếu bạn đang sử dụng Python 2.6 trở lên, để định dạng chuỗi, bạn nên sử dụng định dạng format
mới thay vì %
cũ toán tử - giúp bạn không cần phải sử dụng "các dấu hiệu% tăng gấp đôi", trong số các lợi thế khác. Tôi đã không áp dụng thay đổi đó trong đoạn mã trên chỉ trong trường hợp bạn gặp khó khăn với phiên bản 2.5 trở xuống (vì vậy mã ở trên hoạt động trong bất kỳ phiên bản Python nào, thay vì chỉ trong những phiên bản gần đây hợp lý).