sql >> Base de Datos >  >> RDS >> PostgreSQL

construya una consulta dinámica SQL con la biblioteca python psycopg2 y use buenas herramientas de tipo de conversión

Está intentando pasar un nombre de tabla como parámetro. Probablemente podrías haber visto esto de inmediato si solo hubieras mirado el registro de errores de PostgreSQL.

El nombre de la tabla que está tratando de pasar a través de psycopg2 como parámetro se escapa, lo que produce una consulta como:

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

Esto no es lo que pretendías y no funcionará; no puede escapar de un nombre de tabla como un literal. Debe usar la interpolación normal de cadenas de Python para construir SQL dinámico, solo puede usar marcadores de posición de declaraciones parametrizadas para valores literales reales.

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)

Vea cómo he interpolado el nombre directamente para producir la cadena de consulta:

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

(%% se convierte a simple % por % de sustitución). Luego estoy usando esa consulta con la cadena que define el POLYGON y el otro argumento para ST_GeomFromText como parámetros de consulta.

No lo he probado, pero debería darte la idea correcta y ayudar a explicar qué es lo que está mal.

SÉ EXTREMADAMENTE CUIDADOSO al hacer una interpolación de cadenas como esta, es una vía fácil para la inyección de SQL. Hice una cita muy cruda en el código que se muestra arriba, pero me gustaría usar una función de cita de identificador adecuada si su biblioteca cliente ofrece una.