PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

изградете SQL динамична заявка с psycopg2 python библиотека и използвайки добри инструменти за тип преобразуване

Опитвате се да предадете име на таблица като параметър. Вероятно бихте могли да видите това веднага, ако току-що бяхте погледнали журнала за грешки на PostgreSQL.

Името на таблицата, което се опитвате да прехвърлите през psycopg2 като параметър, се екранира, създавайки заявка като:

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)');'

Това не е това, което сте възнамерявали и няма да работи; не можете да избягате от име на таблица като литерал. Трябва да използвате нормална интерполация на низове на Python, за да конструирате динамичен SQL, можете да използвате само параметризирани заместители на изрази за действителни литерални стойности.

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)

Вижте как директно интерполирах името, за да произведа низа на заявката:

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

(%% се преобразува в обикновен % чрез % заместване). Тогава използвам тази заявка с низа, дефиниращ POLYGON и другият аргумент към ST_GeomFromText като параметри на заявката.

Не съм тествал това, но трябва да ви даде правилната идея и да ви помогне да обясните какво не е наред.

БЪДЕТЕ ИЗКЛЮЧИТЕЛНО ВНИМАТЕЛНИ когато правите интерполация на низ като тази, това е лесен път за SQL инжекция. Направих много грубо цитиране в кода, показан по-горе, но бих искал да използвам подходяща функция за цитиране на идентификатор, ако вашата клиентска библиотека предлага такава.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да конфигурирам HikariCP за postgresql?

  2. Създайте ER диаграма в pgAdmin

  3. Как да попълните липсващите дати в PostgreSQL с помощта на generate_series

  4. Кой е най-препоръчителният начин за съхраняване на време в PostgreSQL с помощта на Java?

  5. Разлика между език sql и език plpgsql във функциите на PostgreSQL