Používáte formátování řetězců v Pythonu a to je velmi špatný nápad (TM). Myslete na SQL-injection. Správný způsob, jak to udělat, je použít vázané proměnné:
cur.execute('INSERT INTO %s (day, elapsed_time, net_time, length, average_speed, geometry) VALUES (%s, %s, %s, %s, %s, %s)', (escaped_name, day, time_length, time_length_net, length_km, avg_speed, myLine_ppy))
kde n-tice parametrů je dán jako druhý argument pro execute()
. Také nemusíte unikat žádné hodnotě, psycopg2 to udělá za vás. V tomto konkrétním případě se také doporučuje nepředávat název tabulky v proměnné (escaped_name
), ale pro vložení do řetězce dotazu:psycopg2 neumí citovat názvy tabulek a sloupců, pouze hodnoty.
Viz dokumentace psycopg2:
https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries
Pokud chcete programově generovat příkaz SQL, obvyklým způsobem je použít formátování Python pro příkaz a vazbu proměnné pro argumenty. Například pokud máte název tabulky v escaped_name
můžete udělat:
query = "INSERT INTO %s (col1, ...) VALUES (%%s, ...)" % escaped_name
curs.execute(query, args_tuple)
Je zřejmé, že pro použití zástupných symbolů v dotazu musíte uvést jakékoli %
které zavádějí vázaný argument v prvním formátu.
Upozorňujeme, že toto je bezpečné pokud a pouze tehdy escaped_name
je generován vaším kódem, který ignoruje jakýkoli externí vstup (například základní název tabulky a počítadlo), ale pokud použijete data poskytnutá uživatelem, hrozí mu vložení SQL.