PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

zbuduj dynamiczne zapytanie SQL za pomocą biblioteki psycopg2 python i używając dobrych narzędzi do konwersji

Próbujesz przekazać nazwę tabeli jako parametr. Prawdopodobnie mógłbyś to zobaczyć od razu, gdybyś tylko spojrzał na dziennik błędów PostgreSQL.

Nazwa tabeli, którą próbujesz przekazać przez psycopg2 jako parametr, jest zmieniana, tworząc zapytanie takie jak:

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

To nie jest to, co zamierzałeś i nie zadziała; nie można uciec od nazwy tabeli jak literał. Aby skonstruować dynamiczny SQL, musisz użyć normalnej interpolacji łańcuchów Pythona, możesz używać tylko sparametryzowanych symboli zastępczych instrukcji dla rzeczywistych wartości literału.

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)

Zobacz, jak bezpośrednio interpolowałem nazwę, aby utworzyć ciąg zapytania:

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

(%% zostaje przekonwertowany na zwykły % przez procentową substytucję). Następnie używam tego zapytania z ciągiem definiującym POLYGON i drugi argument do ST_GeomFromText jako parametry zapytania.

Nie testowałem tego, ale powinno dać ci dobry pomysł i pomóc wyjaśnić, co jest nie tak.

ZACHOWAJ WYJĄTKOWĄ OSTROŻNOŚĆ wykonując taką interpolację ciągów, jest to łatwa droga do wstrzyknięcia SQL. Zrobiłem bardzo prymitywne cytowanie w powyższym kodzie, ale chciałbym użyć odpowiedniej funkcji cytowania identyfikatora, jeśli twoja biblioteka klienta ją oferuje.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcja warunkowego wyprzedzenia/opóźnienia PostgreSQL?

  2. PHP nie ładuje php_pgsql.dll w systemie Windows

  3. ClusterControl — zaawansowane zarządzanie kopiami zapasowymi — PostgreSQL

  4. Jak wyświetlić wartości null podczas uruchamiania zapytań w psql (PostgreSQL)

  5. Jak działa sqrt() w PostgreSQL