2017-08-01 3 views
0

Un curseur psycopg2 prend une chaîne avec des sous-chaînes échappées qui représentent les valeurs text/char/varchar. Par exemple, d'utiliser une procédure stockée qui insère dans une table:Interpolation d'une chaîne non échappée en Python

cur.execute('SELECT insert_profile("name", "favorite color example")') 

Mon problème se produit lorsque je tente d'utiliser l'interpolation de chaîne pour insérer la variable de la chaîne qui est passée à l'exécution de la fonction.

J'ai essayé d'utiliser des guillemets simples sur les variables et des guillemets simples sur le littéral de chaîne, mais cela ne fait que l'opération habituelle. Par exemple:

name = "Harry" 
color = "Blue" 
cur.execute('SELECT insert_profile({0}, {1})'.format(name, color) 

J'ai aussi essayé nicher les variables, mais il insère la chaîne imbriquée littérale dans la base de données:

name = "'Harry'" 
color = "'Blue'" 

Quelle est l'approche correcte? Désolé si la réponse est ailleurs sur SO ou sur internet. Je n'ai pas eu de succès en regardant autour de moi.

Répondre

0

A partir de la page Web psycopg:

cur.execute(
...  """INSERT INTO some_table (an_int, a_date, another_date, a_string) 
...   VALUES (%(int)s, %(date)s, %(date)s, %(str)s);""", 
...  {'int': 10, 'str': "O'Reilly", 'date': datetime.date(2005, 11, 18)}) 

La chaîne de requête a des espaces réservés qui font référence à des touches dans le dictionnaire, et le conducteur interpoler les valeurs avec appropriées citant, échappant etc., qui peut vous faire économiser assez beaucoup d'ennuis. Plus important encore: vous ne devriez jamais créer des requêtes par le biais d'opérations de chaînes telles que l'opération de concat ou format. Cela laisse un énorme trou de sécurité en raison de l'injection SQL. Laissez le conducteur faire le travail dur!