PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Insertion de Psycopg2 dans le tableau avec des espaces réservés

Vous utilisez le formatage de chaîne Python et c'est une très mauvaise idée (TM). Pensez à l'injection SQL. La bonne façon de le faire est d'utiliser des variables liées :

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

où le tuple de paramètres est donné comme deuxième argument à execute() . De plus, vous n'avez pas besoin d'échapper à une valeur, psycopg2 s'en chargera pour vous. Dans ce cas particulier il est également suggéré de ne pas passer le nom de la table dans une variable (escaped_name ) mais pour l'intégrer dans la chaîne de requête :psycopg2 ne sait pas comment citer les noms de table et de colonne, uniquement les valeurs.

Voir la documentation psycopg2 :

https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries

Si vous souhaitez générer par programmation l'instruction SQL, la méthode habituelle consiste à utiliser le formatage Python pour l'instruction et la liaison de variable pour les arguments. Par exemple, si vous avez le nom de la table dans escaped_name vous pouvez faire :

query = "INSERT INTO %s (col1, ...) VALUES (%%s, ...)" % escaped_name
curs.execute(query, args_tuple)

Évidemment, pour utiliser des espaces réservés dans votre requête, vous devez citer n'importe quel % qui introduisent un argument lié dans le premier format.

Notez que c'est sûr si et seulement si escaped_name est généré par votre code en ignorant toute entrée externe (par exemple un nom de base de table et un compteur) mais il risque d'être injecté SQL si vous utilisez des données fournies par l'utilisateur.