Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Vorbereitete Anweisungen mit mysql in Python verwenden

Die Verwendung von vorbereiteten Anweisungen mit MySQL in Python wird z. B. unter http://zetcode.com/db/mysqlpython/ - Suchen Sie auf dieser Seite nach Prepared statements .

In Ihrem Fall wäre das z. B.:

sql = ('INSERT INTO {} (date, time, tag, power) VALUES '
       '(%s, %s, %s, %s)'.format(self.db_scan_table))

und später "in the loop", wie Sie es ausdrücken:

self.cursor.execute(sql, (d, t, tag, power))

ohne weitere Zeichenfolgenformatierung – die MySQLdb Modul übernimmt die Vorbereitung und Ausführung von Teilen in Ihrem Namen (und kann Dinge zwischenspeichern, um zu vermeiden, dass die Arbeit unnötig wiederholt wird usw.).

Bedenken Sie je nach Art der von Ihnen erwähnten "Schleife", dass es möglich ist, dass ein einzelner Aufruf von .execute_many (mit einer Folge von Tupeln als zweites Argument) könnte den Platz der gesamten Schleife einnehmen (es sei denn, Sie benötigen mehr Verarbeitung innerhalb dieser Schleife als nur das Einfügen von Daten in die DB).

Hinzugefügt:Eine bessere Alternative könnte heutzutage sein, mysql's eigenen Connector/Python zu verwenden und das explizite prepare=True Option in .cursor() factory – siehe http://dev .mysql.com/doc/connector-python/en/connector-python-api-mysqlcursorprepared.html . Auf diese Weise können Sie einen bestimmten Cursor darauf haben, welche Anweisungen vorbereitet werden (mit dem Binärprotokoll "effizienter als die Verwendung von PREPARE und EXECUTE", laut dieser mysql.com-Seite) und einen anderen für Anweisungen, die besser nicht vorbereitet sind; "explizit ist besser als implizit" ist immerhin eines der Prinzipien in "The Zen of Python" (import this von einer interaktiven Aufforderung, all diese Prinzipien zu lesen). mysqldb Dinge implizit tun (und es scheint, dass die aktuelle Open-Source-Version nicht tut vorbereitete Anweisungen verwenden) kann keine so gute Architektur sein wie Connector/Python ist expliziter.