sql >> Databáze >  >> RDS >> PostgreSQL

vytvořte dynamický dotaz SQL pomocí knihovny psycopg2 python a pomocí dobrých nástrojů pro typ konverze

Pokoušíte se předat název tabulky jako parametr. Pravděpodobně byste to mohli vidět okamžitě, kdybyste se podívali do protokolu chyb PostgreSQL.

Název tabulky, kterou se pokoušíte předat přes psycopg2 jako parametr, je escapován, čímž vzniká dotaz jako:

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

To není to, co jste zamýšleli a nebude to fungovat; nemůžete uniknout názvu tabulky jako doslovný. Ke konstrukci dynamického SQL musíte použít normální interpolaci řetězců Python, pro skutečné doslovné hodnoty můžete použít pouze zástupné symboly pro parametrizované příkazy.

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)

Podívejte se, jak jsem přímo interpoloval název, abych vytvořil řetězec dotazu:

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

(%% se převede na obyčejné % % substitucí). Pak používám tento dotaz s řetězcem definujícím POLYGON a druhý argument pro ST_GeomFromText jako parametry dotazu.

Netestoval jsem to, ale mělo by vám to poskytnout správnou představu a pomoci vysvětlit, co je špatně.

BUĎTE VELMI OPATRNÍ při provádění interpolace řetězců, jako je tato, je to snadná cesta pro SQL injection. Udělal jsem velmi hrubé citace ve výše uvedeném kódu, ale chtěl bych použít správnou funkci citování identifikátoru, pokud ji vaše klientská knihovna nabízí.



  1. PostgreSQL:Šest ne tak jednoduchých kousků

  2. Klauzule Go a IN v Postgresu

  3. Vypočítejte percentil v MySQL na základě součtů

  4. Jak EXTRACT() funguje v MariaDB