L'utilisation d'instructions préparées avec MySQL en Python est expliquée, par exemple, sur http://zetcode.com/db/mysqlpython/ -- regardez dans cette page pour Prepared statements
.
Dans votre cas, ce serait, par exemple :
sql = ('INSERT INTO {} (date, time, tag, power) VALUES '
'(%s, %s, %s, %s)'.format(self.db_scan_table))
et plus tard, "dans la boucle" comme vous le dites :
self.cursor.execute(sql, (d, t, tag, power))
sans autre formatage de chaîne -- le MySQLdb
module prépare et exécute les parties en votre nom (et peut mettre en cache des éléments pour éviter de répéter inutilement le travail, etc.).
Considérez, selon la nature de "la boucle" que vous mentionnez, qu'il est possible qu'un seul appel à .execute_many
(avec une séquence de tuples comme deuxième argument) pourrait prendre la place de toute la boucle (sauf si vous avez besoin de plus de traitement dans cette boucle au-delà de la simple insertion de données dans la base de données).
Ajout :une meilleure alternative de nos jours peut être d'utiliser le propre Connector/Python
de mysql et l'explicite prepare=True
option dans le .cursor()
usine -- voir http://dev .mysql.com/doc/connector-python/en/connector-python-api-mysqlcursorprepared.html
. Cela vous permet d'avoir un curseur spécifique sur lequel les instructions sont préparées (avec le protocole binaire "plus efficace que d'utiliser PREPARE et EXECUTE", selon cette page mysql.com) et un autre pour les instructions qu'il vaut mieux ne pas préparer ; "explicite vaut mieux qu'implicite" est après tout l'un des principes de "The Zen of Python" (import this
à partir d'une invite interactive pour lire tous ces principes). mysqldb
faire les choses implicitement (et il semble que la version open-source actuelle ne le fasse pas utiliser des instructions préparées) ne peut pas être une aussi bonne architecture que Connector/Python
est plus explicite.