Използването на подготвени оператори с MySQL в Python е обяснено напр. в http://zetcode.com/db/mysqlpython/ -- потърсете в тази страница за Prepared statements
.
Във вашия случай това би било, напр.:
sql = ('INSERT INTO {} (date, time, tag, power) VALUES '
'(%s, %s, %s, %s)'.format(self.db_scan_table))
и по-късно, "в цикъл", както се изразихте:
self.cursor.execute(sql, (d, t, tag, power))
без допълнително форматиране на низ -- MySQLdb
модулът подготвя и изпълнява части от ваше име (и може да кешира неща, за да избегне ненужно повтаряне на работа и т.н. и т.н.).
Помислете, в зависимост от естеството на "цикла", който споменавате, че е възможно едно извикване на .execute_many
(с поредица от кортежи като втори аргумент) може да заеме мястото на целия цикъл (освен ако не се нуждаете от повече обработка в рамките на този цикъл освен само вмъкването на данни в DB).
Добавено:по-добра алтернатива в днешно време може да бъде използването на собствения Connector/Python
на mysql и изричното prepare=True
опция в .cursor()
factory -- вижте http://dev .mysql.com/doc/connector-python/en/connector-python-api-mysqlcursorprepared.html
. Това ви позволява да имате специфичен курсор, върху който се подготвят изрази (с двоичния протокол "по-ефективен от използването на PREPARE и EXECUTE", според тази страница на mysql.com) и друг за изрази, които са по-добре да не се подготвят; "изричното е по-добре от неявното" е в крайна сметка един от принципите в "Дзен на Python" (import this
от интерактивна подкана за четене на всички тези принципи). mysqldb
прави неща имплицитно (и изглежда, че текущата версия с отворен код не използвайте подготвени изрази) не може да бъде толкова добра архитектура като Connector/Python
е по-изрично.