PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

crea query SQL dinamiche con la libreria python psycopg2 e utilizzando buoni strumenti di tipo di conversione

Stai tentando di passare un nome di tabella come parametro. Probabilmente avresti potuto vederlo immediatamente se avessi appena guardato il registro degli errori di PostgreSQL.

Il nome della tabella che stai tentando di passare attraverso psycopg2 come parametro viene sottoposto a escape, producendo una query del tipo:

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

Questo non è quello che intendevi e non funzionerà; non puoi sfuggire a un nome di tabella come un letterale. È necessario utilizzare la normale interpolazione di stringhe Python per costruire SQL dinamico, è possibile utilizzare solo segnaposto di istruzioni parametrizzati per i valori letterali effettivi.

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)

Guarda come ho interpolato il nome direttamente per produrre la stringa di query:

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

(%% viene convertito in normale % per % di sostituzione). Quindi sto usando quella query con la stringa che definisce il POLYGON e l'altro argomento in ST_GeomFromText come parametri di ricerca.

Non l'ho testato, ma dovrebbe darti l'idea giusta e aiutarti a spiegare cosa c'è che non va.

FARE MOLTA ATTENZIONE quando si esegue un'interpolazione di stringhe in questo modo, è una strada facile per l'iniezione SQL. Ho fatto citazioni molto grossolane nel codice mostrato sopra, ma vorrei usare una funzione di citazione degli identificatori adeguata se la tua libreria client ne offre una.