Używanie przygotowanych instrukcji z MySQL w Pythonie jest wyjaśnione np. na http://zetcode.com/db/mysqlpython/ -- poszukaj na tej stronie Prepared statements
.
W Twoim przypadku byłoby to np.:
sql = ('INSERT INTO {} (date, time, tag, power) VALUES '
'(%s, %s, %s, %s)'.format(self.db_scan_table))
a później „w pętli”, jak to ująłeś:
self.cursor.execute(sql, (d, t, tag, power))
bez dalszego formatowania ciągów -- MySQLdb
moduł przygotowuje i wykonuje części w Twoim imieniu (i może buforować rzeczy, aby uniknąć niepotrzebnego powtarzania pracy itp.).
Należy wziąć pod uwagę, w zależności od charakteru „pętli”, o której wspomniałeś, że możliwe jest, że pojedyncze wywołanie .execute_many
(z sekwencją krotek jako drugim argumentem) może zająć miejsce całej pętli (chyba że potrzebujesz więcej przetwarzania w tej pętli poza samym wstawianiem danych do bazy danych).
Dodano:obecnie lepszą alternatywą może być użycie własnego Connector/Python
mysql i jawne prepare=True
opcja w .cursor()
fabryka -- patrz http://dev .mysql.com/doc/connector-python/pl/connector-python-api-mysqlcursorprepared.html
. Dzięki temu masz określony kursor, na którym przygotowywane są instrukcje (z protokołem binarnym "bardziej wydajnym niż używanie PREPARE i EXECUTE", zgodnie z tą stroną mysql.com) i drugi dla instrukcji, które lepiej nie są przygotowane; „wyraźne jest lepsze niż niejawne” jest w końcu jedna z zasad zawartych w „Zen Pythona” (import this
z interaktywnej zachęty do przeczytania wszystkich tych zasad). mysqldb
robienie rzeczy niejawnie (i wygląda na to, że obecna wersja open-source nie) użyj przygotowanych instrukcji) nie może być tak dobrą architekturą jak Connector/Python
jest bardziej jednoznaczny.