sql >> データベース >  >> RDS >> Mysql

Pythonのmysqlでプリペアドステートメントを使用する

    PythonでのMySQLでのプリペアドステートメントの使用については、たとえばhttp://zetcode.com/db/mysqlpython/<で説明されています。 / a> -そのページ内でPrepared statementsを探します 。

    あなたの場合、それは例えば:

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

    そして後で、あなたがそれを置くように「ループの中で」:

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

    それ以上の文字列フォーマットなし-MySQLdb モジュールは、ユーザーに代わってパーツの準備と実行を行います(また、不必要に作業を繰り返さないようにするために、キャッシュする場合があります)。

    言及する「ループ」の性質によっては、.execute_manyへの1回の呼び出しが可能であると考えてください。 (2番目の引数としてタプルのシーケンスを使用)ループ全体の代わりになる可能性があります(DBへのデータの挿入だけでなく、そのループ内でより多くの処理が必要な場合を除く)。

    追加:最近のより良い代替手段は、mysql独自のConnector/Pythonを使用することです。 明示的なprepare=True .cursor()のオプション ファクトリ- http://devを参照してください.mysql.com / doc / connector-python / en / connector-python-api-mysqlcursorprepared.html 。これにより、ステートメントが準備される特定のカーソル(そのmysql.comページによると「PREPAREおよびEXECUTEを使用するよりも効率的」バイナリプロトコルを使用)と、準備されていないステートメント用の別のカーソルを使用できます。 「暗黙的よりも明示的の方が優れている」 結局のところ、「Pythonの禅」の原則の1つ(import this これらすべての原則を読むためのインタラクティブなプロンプトから)。 mysqldb 暗黙のうちに物事を行う(そして現在のオープンソースバージョンはそうではないようです プリペアドステートメントを使用する)は、Connector/Pythonほど優れたアーキテクチャにはなり得ません のより明確なもの。



    1. 最初の文字を大文字にします。 MySQL

    2. 私のc#アプリケーションで*.sqlmysqlファイルを実行する方法

    3. 更新後に以前の値を取得する-MySql

    4. Oracleの数値関数かどうかを確認します