Brug af forberedte udsagn med MySQL i Python er forklaret f.eks. på http://zetcode.com/db/mysqlpython/ -- kig på den side efter Prepared statements
.
I dit tilfælde ville det f.eks. være:
sql = ('INSERT INTO {} (date, time, tag, power) VALUES '
'(%s, %s, %s, %s)'.format(self.db_scan_table))
og senere "in the loop", som du siger det:
self.cursor.execute(sql, (d, t, tag, power))
uden yderligere strengformatering -- MySQLdb
modulet forbereder og udfører dele på dine vegne (og kan cache ting for at undgå at gentage arbejde unødvendigt osv. osv.).
Overvej, afhængigt af arten af "sløjfen", du nævner, at det er muligt, at et enkelt kald til .execute_many
(med en sekvens af tupler som det andet argument) kunne træde i stedet for hele løkken (medmindre du har brug for mere behandling i den løkke ud over blot indsættelse af data i DB).
Tilføjet:et bedre alternativ i dag kan være at bruge mysqls egen Connector/Python
og den eksplicitte prepare=True
mulighed i .cursor()
fabrik -- se http://dev .mysql.com/doc/connector-python/en/connector-python-api-mysqlcursorprepared.html
. Dette giver dig mulighed for at have en specifik markør, som sætninger er forberedt på (med den "mere effektiv end at bruge PREPARE and EXECUTE" binære protokol, ifølge den mysql.com-side) og en anden for sætninger, der bedre ikke er forberedt; "eksplicit er bedre end implicit" er trods alt et af principperne i "The Zen of Python" (import this
fra en interaktiv opfordring til at læse alle disse principper). mysqldb
gør ting implicit (og det ser ud til, at den nuværende open source-version ikke gør det). brug forberedte udsagn) kan ikke være så god en arkitektur som Connector/Python
er mere eksplicit.