Saya percaya bahwa pernyataan berparametri seperti ini dimaksudkan untuk digunakan dengan nilai dan bukan nama tabel (atau kata kunci SQL, dll.). Jadi pada dasarnya Anda kurang beruntung dengan ini.
Namun, jangan khawatir, karena mekanisme ini dimaksudkan untuk mencegah injeksi SQL, dan Anda biasanya tahu tabel apa yang ingin Anda akses pada saat penulisan kode, jadi kecil kemungkinan seseorang dapat menyuntikkan kode berbahaya. Silakan saja dan tulis tabel dalam string.
Jika, untuk beberapa alasan (mungkin menyimpang) Anda menyimpan parametrik nama tabel seperti itu:
- Jika nama tabel berasal dari program Anda (misalnya kamus, atau atribut kelas), lakukan substitusi string seperti biasa.
- Jika nama tabel berasal dari dunia luar (pikirkan "input pengguna"):jangan lakukan itu, atau percayai pengguna sepenuhnya dan terapkan pendekatan sebelumnya 1.
Misalnya:
cursor.execute(
'SELECT * FROM %s where %s = %s'
% ("my_table", "colum_name", "%s"), #1
("'some;perverse'string;--drop table foobar")) #2
#1
:Biarkan %s ketiga diganti dengan '%s' lain saat ini, untuk memungkinkan pemrosesan selanjutnya oleh psycopg2#2
:Ini adalah string yang akan dikutip dengan benar oleh psycopg2 dan ditempatkan sebagai ganti '%s' ketiga dalam string asli