您试图将表名作为参数传递。如果仅查看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));
(通过%替换%%
转换为纯%
文本)。然后,我将该查询与定义thePOLYGON
和另一个参数ST_GeomFromText
作为查询参数的字符串一起使用。
我尚未对此进行测试,但是它应该为您提供正确的想法并帮助您解释问题所在。
,这是SQL注入的简便方法。我已经在上面显示的代码中做了非常粗略的引用,但是如果您的客户端库提供了一个标识符引用功能,我想使用一个适当的标识符引用功能。