Imbriquer une liste dans la clause IN dans Python MySQL
P粉781235689
P粉781235689 2023-08-22 17:04:59
0
2
400
<p>Je sais comment mapper une liste sur une chaîne : </p> <pre class="brush:php;toolbar:false;">foostring = ",".join( map(str, list_of_ids) )</pre> <p>Je sais que je peux mettre cette chaîne dans une clause IN en utilisant : </p> <pre class="brush:php;toolbar:false;">cursor.execute("DELETE FROM foo.bar WHERE baz IN ('%s')" % (foostring))</pre> <p>Je dois implémenter la même fonctionnalité dans une base de données MySQL de manière sûre (en évitant l'injection SQL). Dans l'exemple ci-dessus, comme foostring n'est pas passé en paramètre à exécuter, il est vulnérable. Je dois également citer et m'échapper en dehors de la bibliothèque MySQL. </p> <p> (Il existe une question SO connexe, mais les réponses qui y sont répertoriées ne fonctionnent pas avec les bases de données MySQL ou sont vulnérables aux attaques par injection SQL.) </p>
P粉781235689
P粉781235689

répondre à tous(2)
P粉434996845

Bien que cette question soit ancienne, je voulais laisser une réponse au cas où quelqu'un d'autre chercherait également ce que je recherche

La réponse acceptée devient confuse lorsque nous avons beaucoup de paramètres ou que nous souhaitons utiliser des paramètres nommés

Après quelques tentatives

ids = [5, 3, ...]  # id列表
cursor.execute('''
SELECT 
...
WHERE
  id IN %(ids)s
  AND created_at > %(start_dt)s
''', {
  'ids': tuple(ids), 'start_dt': '2019-10-31 00:00:00'
})

Testé et réussi sous python2.7pymysql==0.7.11

P粉212114661

Utiliser directementlist_of_ids :

format_strings = ','.join(['%s'] * len(list_of_ids))
cursor.execute("DELETE FROM foo.bar WHERE baz IN (%s)" % format_strings,
                tuple(list_of_ids))

De cette façon, vous pouvez éviter de vous citer et éviter divers problèmes d'injection SQL.

Notez que les données (list_of_ids) sont transmises directement au pilote MySQL en tant que paramètres (pas dans le texte de la requête), il n'y a donc pas de problèmes d'injection. Vous pouvez conserver tous les caractères de la chaîne sans les supprimer ni les citer.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!