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

buat kueri dinamis SQL dengan pustaka python psycopg2 dan menggunakan alat tipe konversi yang baik

Anda mencoba memberikan nama tabel sebagai parameter. Anda mungkin bisa langsung melihat ini jika Anda baru saja melihat log kesalahan PostgreSQL.

Nama tabel yang Anda coba lewati psycopg2 sebagai parameter sedang diloloskan, menghasilkan kueri seperti:

INSERT INTO E'my_table'(name, url, id, point_geom, poly_geom) VALUES (E'ST_GeomFromText(''POLYGON(( 52.146542 19.050557, 52.148430 19.045527, 52.149525 19.045831, 52.147400 19.050780, 52.147400 19.050780, 52.146542 19.050557))'',4326)');'

Ini bukan yang Anda maksudkan dan tidak akan berhasil; anda tidak dapat menghindari nama tabel seperti literal. Anda harus menggunakan interpolasi string Python normal untuk membuat SQL dinamis, Anda hanya dapat menggunakan placeholder pernyataan berparameter untuk nilai literal aktual.

params = ('POLYGON(( 52.146542 19.050557, 52.148430 19.045527, 52.149525 19.045831, 52.147400 19.050780, 52.147400 19.050780, 52.146542 19.050557))',4326)
escaped_name = name.replace('"",'""')
curs.execute('INSERT INTO "%s"(name, url, id, point_geom, poly_geom) VALUES (ST_GeomFromText(%%s,%%s));' % escaped_name, params)

Lihat bagaimana saya menginterpolasi nama secara langsung untuk menghasilkan string kueri:

INSERT INTO my_table(name, url, id, point_geom, poly_geom) VALUES (ST_GeomFromText(%s,%s));

(%% akan dikonversi menjadi % plain biasa dengan % substitusi). Lalu saya menggunakan kueri itu dengan string yang mendefinisikan POLYGON dan argumen lainnya untuk ST_GeomFromText sebagai parameter kueri.

Saya belum menguji ini, tetapi ini akan memberi Anda ide yang benar dan membantu menjelaskan apa yang salah.

SANGAT HATI-HATI ketika melakukan interpolasi string seperti ini, ini adalah jalan yang mudah untuk injeksi SQL. Saya telah melakukan kutipan yang sangat kasar dalam kode yang ditunjukkan di atas, tetapi saya ingin menggunakan fungsi kutipan pengenal yang tepat jika perpustakaan klien Anda menawarkannya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menginstal Postgis ke instalasi Tong [dilindungi email] menggunakan Homebrew?

  2. Instalasi PostgresSQL gagal:inisialisasi klaster basis data gagal os MAC

  3. Setel ulang penghitung kenaikan otomatis di postgres

  4. Tidak dapat menemukan header 'libpq-fe.h saat mencoba menginstal pg gem

  5. Tidak ada batasan unik atau pengecualian yang cocok dengan ON CONFLICT