Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lỗi Python và mySQLdb:OperationalError:(1054, Cột không xác định trong 'mệnh đề where')

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ý).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Quyền xem / cập nhật / quản lý tài nguyên lồng nhau của MySQL (bảng tổng hợp)

  2. Ngoại lệ của trình kết nối MySQL 6.7.4 và Entity Framework 5

  3. UnsupportedOperationException với DriverManager.getConnection () trên Android

  4. Câu lệnh do PDO chuẩn bị này trả về false nhưng không tạo ra lỗi

  5. Lỗi với truy vấn TABLE trong MySQL