Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Usando instruções preparadas com mysql em python


O uso de instruções preparadas com MySQL em Python é explicado, por exemplo, em http://zetcode.com/db/mysqlpython/ -- procure dentro dessa página por Prepared statements .

No seu caso, seria, por exemplo:
sql = ('INSERT INTO {} (date, time, tag, power) VALUES '
       '(%s, %s, %s, %s)'.format(self.db_scan_table))

e mais tarde, "no loop" como você colocou:
self.cursor.execute(sql, (d, t, tag, power))

sem mais formatação de string -- o MySQLdb O módulo prepara e executa as partes em seu nome (e pode armazenar em cache as coisas para evitar repetir o trabalho desnecessariamente, etc, etc).

Considere, dependendo da natureza do "loop" que você mencionou, que é possível que uma única chamada para .execute_many (com uma sequência de tuplas como segundo argumento) poderia substituir todo o loop (a menos que você precise de mais processamento dentro desse loop além da inserção de dados no banco de dados).

Adicionado:uma alternativa melhor hoje em dia pode ser usar o próprio Connector/Python do mysql e o explícito prepare=True opção no .cursor() factory -- veja http://dev .mysql.com/doc/connector-python/en/connector-python-api-mysqlcursorprepared.html . Isso permite que você tenha um cursor específico sobre quais declarações são preparadas (com o protocolo binário "mais eficiente que usar PREPARE e EXECUTE", de acordo com a página mysql.com) e outro para declarações que são melhores não preparadas; "explícito é melhor que implícito" é afinal um dos princípios em "The Zen of Python" (import this a partir de um prompt interativo para ler todos esses princípios). mysqldb fazendo as coisas implicitamente (e parece que a versão atual de código aberto não use instruções preparadas) não pode ser uma arquitetura tão boa quanto Connector/Python é mais explícito.