2012-03-01 1 views
8

J'essaie de parcourir toutes les lignes d'une table nommée Throughput, mais pour un DeviceName spécifique (que j'ai stocké dans les données ['DeviceName'] . Je l'ai essayé ce qui suit, mais il ne fonctionne pas:pyodbc - Comment effectuer une instruction select en utilisant une variable pour un paramètre

for row in cursor.execute("select * from Throughput where DeviceName=%s"), %(data['DeviceName']): 

EDIT: aussi essayé cela, mais il ne fonctionne pas:

for row in cursor.execute("select * from Throughput where(DeviceName), values(?)", (data['DeviceName'])): 

EDIT2: Un extrait de mon code de travail final :

query = "select * from Throughput where DeviceName = '%s'" % data['Device Name'] 
     try: 
      for row in cursor.execute(query): 
+0

"Ne fonctionne pas" comment? Quelle erreur ou comportement inattendu recevez-vous? – Andy

Répondre

-11

Sans connaître le type de la colonne DeviceName et ce serveur base de données, je citerais la chaîne qui est utilisée pour contraindre DeviceName

"select * from Throughput where DeviceName='%s'" % data['DeviceName'] 

et de voir ce qui se passe.

+0

Merci. Cela a fait l'affaire! – Parth

+6

Si 'data ['DeviceName']' est fourni par l'utilisateur de quelque façon que ce soit (direct ou indirect), vous venez de vous ouvrir pour des attaques par injection SQL. Ou le nom de périphérique utilise des guillemets et cela casse simplement. * Et * il est inefficace car le pilote ne peut pas réutiliser le plan de requête préparé pour l'instruction SQL. –

33

Vous êtes également en mesure de parameterize déclarations:

... 
cursor.execute("select * from Throughput where DeviceName = ?", data['DeviceName']) 
... 

Cette une meilleure approche pour les raisons suivantes:

  • Protection contre l'injection SQL (vous devez toujours valider les entrées utilisateur indépendamment du fait que paramétrés ou SQL dynamique est utilisé)
  • Vous n'avez pas à vous soucier d'échapper les valeurs de clause where avec guillemets simples puisque les paramètres sont passés séparément à la base de données
  • SQL est préparé une fois, les exécutions ultérieures de la requête utilisent l'instruction préparée au lieu de recompiler
+0

En faisant cela, est-il possible d'imprimer la requête entière, parce que j'ai une erreur de conversion date/heure, mais je ne sais pas où, quand j'imprime la chaîne de requête, il montre les points d'interrogation plutôt que les valeurs réelles qui sont censées remplacer ces points d'interrogation. Si vous pouviez jeter un oeil à mon problème sur http://stackoverflow.com/questions/37861319/pyodbc-cursor-execute-wont-insert-parameters-into-sql-string?noredirect=1#comment63185389_37861319 J'apprécierais vraiment . –

+0

@ M.Barbieri, activer la journalisation dans MySQL pour voir quelle instruction a été réellement exécutée. – DrDamnit

Questions connexes