Použití připravených příkazů s MySQL v Pythonu je vysvětleno např. na http://zetcode.com/db/mysqlpython/ -- na této stránce vyhledejte Prepared statements
.
Ve vašem případě by to bylo např.:
sql = ('INSERT INTO {} (date, time, tag, power) VALUES '
'(%s, %s, %s, %s)'.format(self.db_scan_table))
a později „ve smyčce“, jak jste to uvedl:
self.cursor.execute(sql, (d, t, tag, power))
bez dalšího formátování řetězců -- MySQLdb
modul za vás připraví a spustí části (a může věci uložit do mezipaměti, aby se zabránilo zbytečnému opakování práce atd., atd.).
Zvažte, v závislosti na povaze "smyčky", kterou zmiňujete, že je možné, že jediné volání .execute_many
(se sekvencí n-tic jako druhým argumentem) by mohla nahradit celou smyčku (pokud v této smyčce nepotřebujete více zpracování než pouhé vkládání dat do DB).
Přidáno:lepší alternativou v dnešní době může být použití vlastního Connector/Python
mysql a explicitní prepare=True
možnost v .cursor()
továrna – viz http://dev .mysql.com/doc/connector-python/en/connector-python-api-mysqlcursorprepared.html
. To vám umožní mít konkrétní kurzor na tom, které příkazy se připravují (s binárním protokolem „efektivnější než použití PREPARE a EXECUTE“, podle té stránky mysql.com) a jiný pro příkazy, které je lepší nepřipravovat; "explicitní je lepší než implicitní" je koneckonců jeden z principů v "The Zen of Python" (import this
z interaktivní výzvy k přečtení všech těchto zásad). mysqldb
dělat věci implicitně (a zdá se, že současná verze s otevřeným zdrojovým kódem nedělá použít připravené příkazy) nemůže být tak dobrá architektura jako Connector/Python
's jasnější.