Menggunakan pernyataan yang disiapkan dengan MySQL dengan Python dijelaskan misalnya di http://zetcode.com/db/mysqlpython/ -- lihat di dalam halaman itu untuk Prepared statements
.
Dalam kasus Anda, itu adalah, misalnya:
sql = ('INSERT INTO {} (date, time, tag, power) VALUES '
'(%s, %s, %s, %s)'.format(self.db_scan_table))
dan kemudian, "dalam lingkaran" seperti yang Anda katakan:
self.cursor.execute(sql, (d, t, tag, power))
tanpa pemformatan string lebih lanjut -- MySQLdb
module melakukan persiapan dan eksekusi bagian atas nama Anda (dan mungkin menyimpan hal-hal untuk menghindari pengulangan pekerjaan yang tidak perlu, dll, dll).
Pertimbangkan, tergantung pada sifat "loop" yang Anda sebutkan, bahwa mungkin saja satu panggilan ke .execute_many
(dengan urutan tupel sebagai argumen kedua) dapat menggantikan seluruh loop (kecuali jika Anda memerlukan lebih banyak pemrosesan dalam loop tersebut selain penyisipan data ke dalam DB).
Ditambahkan:alternatif yang lebih baik saat ini mungkin menggunakan Connector/Python
mysql sendiri dan prepare=True
yang eksplisit opsi di .cursor()
pabrik -- lihat http://dev .mysql.com/doc/connector-python/en/connector-python-api-mysqlcursorprepared.html
. Ini memungkinkan Anda memiliki kursor khusus di mana pernyataan disiapkan (dengan protokol biner "lebih efisien daripada menggunakan SIAPKAN dan JALANKAN", menurut halaman mysql.com itu) dan satu lagi untuk pernyataan yang lebih baik tidak disiapkan; "eksplisit lebih baik daripada implisit" adalah setelah semua salah satu prinsip dalam "The Zen of Python" (import this
dari prompt interaktif untuk membaca semua prinsip itu). mysqldb
melakukan sesuatu secara implisit (dan tampaknya versi open-source saat ini tidak gunakan pernyataan yang disiapkan) tidak dapat menjadi arsitektur yang sebaik Connector/Python
yang lebih eksplisit.