Quelle est la méthode correcte pour que la liste (countryList) soit disponible via% s dans l'instruction SQL?
# using psycopg2
countryList=['UK','France']
sql='SELECT * from countries WHERE country IN (%s)'
data=[countryList]
cur.execute(sql,data)
Dans l’état actuel des choses, le système affiche une erreur après avoir tenté d’exécuter "WHERE in (ARRAY [...])". Y at-il un moyen de faire cela autrement que par la manipulation de chaîne?
Merci
Pour l'opérateur IN
, vous voulez un Tuple au lieu de list et supprimer les parenthèses de la chaîne SQL.
# using psycopg2
data=('UK','France')
sql='SELECT * from countries WHERE country IN %s'
cur.execute(sql,(data,))
Pendant le débogage, vous pouvez vérifier que le SQL est construit correctement avec
cur.mogrify(sql, (data,))
Pour développer un peu la réponse et traiter les paramètres nommés, et convertir des listes en tuples:
countryList = ['UK', 'France']
sql = 'SELECT * from countries WHERE country IN %(countryList)s'
cur.execute(sql, { # You can pass a dict for named parameters rather than a Tuple. Makes debugging hella easier.
'countryList': Tuple(countryList), # Converts the list to a Tuple.
})
Vous pouvez utiliser une liste python directement comme ci-dessous. Il agit comme l'opérateur IN en SQL et gère également une liste vide sans générer d'erreur.
data=['UK','France']
sql='SELECT * from countries WHERE country = ANY (%s)'
cur.execute(sql,(data,))
source: http://initd.org/psycopg/docs/usage.html#lists-adaptation