web-dev-qa-db-fra.com

Instruction Python/psycopg2 WHERE IN

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

41
Matt

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,))
64
Bryan

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.
})
16
Joshua Burns

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

0
Praveen KR