Tôi tin rằng các câu lệnh được tham số hóa như thế này được sử dụng với giá trị và không phải tên bảng (hoặc từ khóa SQL, v.v.). Vì vậy, về cơ bản bạn không gặp may với điều này.
Tuy nhiên, đừng lo lắng, vì cơ chế này nhằm ngăn chặn việc tiêm SQL và bạn thường biết bảng nào bạn muốn truy cập tại thời điểm viết mã, vì vậy rất ít khả năng ai đó có thể đưa mã độc vào. Chỉ cần tiếp tục và viết bảng trong chuỗi.
Nếu, vì một số lý do (có thể là sai lầm) mà bạn giữ tham số của tên bảng như vậy:
- Nếu tên bảng đến từ chương trình của bạn (ví dụ:từ điển hoặc thuộc tính lớp), thì hãy thực hiện thay thế chuỗi thông thường.
- Nếu tên bảng đến từ thế giới bên ngoài (nghĩ là "đầu vào của người dùng"):không làm như vậy hoặc tin tưởng hoàn toàn vào người dùng và áp dụng phương pháp trước đó 1.
Ví dụ:
cursor.execute(
'SELECT * FROM %s where %s = %s'
% ("my_table", "colum_name", "%s"), #1
("'some;perverse'string;--drop table foobar")) #2
#1
:Hãy để% s thứ ba được thay thế bằng một '% s' khác tại thời điểm này, để cho phép xử lý sau bởi psycopg2 #2
:Đây là chuỗi sẽ được psycopg2 trích dẫn chính xác và được đặt thay vì '% s' thứ ba trong chuỗi gốc