sql >> Databasteknik >  >> RDS >> PostgreSQL

bygga en dynamisk SQL-fråga med psycopg2 python-bibliotek och använda bra konverteringsverktyg

Du försöker skicka ett tabellnamn som en parameter. Du hade förmodligen kunnat se detta direkt om du bara hade tittat på PostgreSQL-felloggen.

Tabellnamnet du försöker skicka genom psycopg2 som en parameter escapes, vilket ger en fråga som:

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

Det här är inte vad du tänkt och kommer inte att fungera; du kan inte fly ett tabellnamn som en bokstavlig. Du måste använda normal Python-stränginterpolation för att konstruera dynamisk SQL, du kan bara använda parametriserade satsplatshållare för faktiska bokstavliga värden.

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)

Se hur jag har interpolerat namnet direkt för att skapa frågesträngen:

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

(%% konverteras till vanlig % med % substitution). Sedan använder jag den frågan med strängen som definierar POLYGON och det andra argumentet till ST_GeomFromText som frågeparametrar.

Jag har inte testat det här, men det borde ge dig rätt uppfattning och hjälpa dig att förklara vad som är fel.

VAR EXTREMT FÖRSIKTIG när du gör stränginterpolation som denna är det en enkel väg för SQL-injektion. Jag har gjort väldigt grova citat i koden som visas ovan, men jag skulle vilja använda en korrekt identifieringsfunktion om ditt klientbibliotek erbjuder en sådan.



  1. Hur DATEDIFF() fungerar i MariaDB

  2. Ansluter Oracle 21c till SQL Server

  3. Guide för CTE i SQL Server

  4. Så här kontrollerar du din PostgreSQL-version