PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

psycopg2 cursor.execute() dengan parameter query SQL menyebabkan kesalahan sintaks

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:

  1. Jika nama tabel berasal dari program Anda (misalnya kamus, atau atribut kelas), lakukan substitusi string seperti biasa.
  2. 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memutakhirkan dari PostGIS 2.1:Kesalahan:mencoba mendefinisikan ulang parameter postgis.backend

  2. Bagaimana justify_interval() Bekerja di PostgreSQL

  3. Apache Cayenne / PostgreSQL:terlalu banyak klien yang sudah error

  4. Target waktu pemulihan pgbackrest

  5. PostgreSQL 9.6:Pemindaian Sekuensial Paralel