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

Psycopg2 Vložit do tabulky se zástupnými symboly

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.



  1. Jak zacházet s booleovskými hodnotami v SQLite pomocí JavaScript proxy

  2. Limit podmínky MySQL IN

  3. Hash připojte se k Oracle s příkladem

  4. Proč se pg_restore úspěšně vrací, ale ve skutečnosti neobnovuje moji databázi?