Mysql
 sql >> Database >  >> RDS >> Mysql

Utilizzo di istruzioni preparate con mysql in python

L'uso di istruzioni preparate con MySQL in Python è spiegato ad esempio in http://zetcode.com/db/mysqlpython/ -- cerca in quella pagina Prepared statements .

Nel tuo caso, sarebbe, ad esempio:

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

e più tardi, "in the loop", come dici tu:

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

senza ulteriori formattazioni di stringhe -- il MySQLdb il modulo prepara ed esegue le parti per tuo conto (e può memorizzare nella cache le cose per evitare di ripetere il lavoro inutilmente, ecc, ecc.).

Considera, a seconda della natura del "ciclo" che citi, che è possibile che una singola chiamata a .execute_many (con una sequenza di tuple come secondo argomento) potrebbe prendere il posto dell'intero ciclo (a meno che non sia necessaria una maggiore elaborazione all'interno di quel ciclo oltre al semplice inserimento di dati nel DB).

Aggiunto:un'alternativa migliore al giorno d'oggi potrebbe essere quella di utilizzare il proprio Connector/Python di mysql e l'esplicito prepare=True opzione nel .cursor() fabbrica -- vedere http://dev .mysql.com/doc/connector-python/en/connector-python-api-mysqlcursorprepared.html . Ciò ti consente di avere un cursore specifico su cui vengono preparate le istruzioni (con il protocollo binario "più efficiente rispetto all'uso di PREPARE ed ESEGUI", secondo quella pagina mysql.com) e un altro per le istruzioni che è meglio non preparare; "esplicito è meglio di implicito" è dopotutto uno dei principi in "The Zen of Python" (import this da un prompt interattivo per leggere tutti quei principi). mysqldb fare le cose in modo implicito (e sembra che l'attuale versione open source non lo faccia utilizzare istruzioni preparate) non può essere un'architettura buona come Connector/Python quello più esplicito.