sql >> Database >  >> RDS >> Mysql

Voorbereide instructies gebruiken met mysql in python

Het gebruik van voorbereide instructies met MySQL in Python wordt bijvoorbeeld uitgelegd op http://zetcode.com/db/mysqlpython/ -- kijk op die pagina voor Prepared statements .

In uw geval zou dat bijvoorbeeld zijn:

sql = ('INSERT INTO {} (date, time, tag, power) VALUES '
       '(%s, %s, %s, %s)'.format(self.db_scan_table))

en later, "in de loop" zoals u het zegt:

self.cursor.execute(sql, (d, t, tag, power))

zonder verdere tekenreeksopmaak -- de MySQLdb module bereidt de onderdelen voor en voert ze namens u uit (en kan dingen in de cache plaatsen om onnodige herhaling van werk te voorkomen, enz.).

Houd er rekening mee dat, afhankelijk van de aard van "de lus" die u noemt, het mogelijk is dat een enkele aanroep naar .execute_many (met een reeks tupels als tweede argument) zou de plaats van de hele lus kunnen innemen (tenzij u meer verwerking binnen die lus nodig heeft dan alleen het invoegen van gegevens in de DB).

Toegevoegd:een beter alternatief kan tegenwoordig zijn om mysql's eigen Connector/Python te gebruiken en de expliciete prepare=True optie in de .cursor() fabriek -- zie http://dev .mysql.com/doc/connector-python/en/connector-python-api-mysqlcursorprepared.html . Hierdoor kun je een specifieke cursor hebben waarop uitspraken worden voorbereid (met het binaire protocol "efficiënter dan het gebruik van PREPARE en EXECUTE", volgens die mysql.com-pagina) en een andere voor instructies die beter niet zijn voorbereid; "expliciet is beter dan impliciet" is tenslotte een van de principes in "The Zen of Python" (import this van een interactieve prompt om al die principes te lezen). mysqldb dingen impliciet doen (en het lijkt erop dat de huidige open-sourceversie niet doet) gebruik voorbereide instructies) kan niet zo'n goede architectuur zijn als Connector/Python is explicieter.



  1. Verschil van twee datums in sql-server

  2. MySQL-syntaxisfout krijgen na het indienen van het formulier

  3. Hoe achterlopende nullen van een decimaal te verwijderen in PostgreSQL

  4. Vervang NOT IN door LEFT JOIN in SQL-statement