PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

crie uma consulta dinâmica SQL com a biblioteca python psycopg2 e use boas ferramentas de tipo de conversão


Você está tentando passar um nome de tabela como parâmetro. Você provavelmente poderia ter visto isso imediatamente se tivesse visto o log de erros do PostgreSQL.

O nome da tabela que você está tentando passar pelo psycopg2 como parâmetro está sendo escapado, produzindo uma 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)');'

Isso não é o que você pretendia e não funcionará; você não pode escapar de um nome de tabela como um literal. Você deve usar a interpolação de string Python normal para construir SQL dinâmico, você só pode usar espaços reservados de instrução parametrizada para valores literais reais.
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)

Veja como interpolei o nome diretamente para produzir a string de consulta:
INSERT INTO my_table(name, url, id, point_geom, poly_geom) VALUES (ST_GeomFromText(%s,%s));

(%% é convertido em % simples por % de substituição). Então estou usando essa consulta com a string definindo o POLYGON e o outro argumento para ST_GeomFromText como parâmetros de consulta.

Eu não testei isso, mas deve dar a você a ideia certa e ajudar a explicar o que está errado.

TENHA MUITO CUIDADO ao fazer interpolação de strings como esta, é um caminho fácil para injeção de SQL. Fiz citações muito grosseiras no código mostrado acima, mas gostaria de usar uma função de citação de identificador adequada se sua biblioteca cliente oferecer uma.