【mysql-connector-python】PythonからMySQLを操作する
PythonのMySQLドライバ、mysql-connector-pythonを使っていて躓いたので、その備忘録も兼ねて紹介します。
PythonでMySQLを操作しようと思ったら
まずドライバをインストールしなければいけません。
いろんな種類があり、紹介マニアどらふと版: Python の MySQL ドライバはどれを利用すれば良いのか に分かりやすくまとめられています。
僕はmysql-connector-pythonをチョイスしました。
特徴はMySQL公式のドライバだという点ですね。
公式がいいのか!と言われるとケースバイケースだと思いますが、最近使っているMySQL Workbenchという公式のGUIツールが使いやすかったので。
インストール
pipでいけます。
$ pip install mysql-connector-python
基本的な使い方
次のようなデータをinsertし、それをselectするコードを書いてみます。
(テーブルは作成済みとする)
student_id | name | sex |
---|---|---|
1 | 山田太郎 | 男 |
test.py
#!/usr/bin/env python # -*- coding: utf-8 -*- # ドライバをimport import mysql.connector if __name__ == '__main__': # データベースに接続 connect = mysql.connector.connect(user='hoge', password='hoge', host='hoge', database='hoge', charset='utf8') cursor = connect.cursor() name = '山田太郎' sex = '男' # insert cursor.execute('insert into student_table (name, sex) values (%s, %s)', (name, sex)) # select cursor.execute('select * from student_table') row = cursor.fetchone() # 出力 for i in row: print(i) # データベースから切断 cursor.close() connect.close()
実行結果
$ python test.py 1 山田太郎 男
今回はレコードを1つinsertし、それをselectするというものだったのでfetchone 関数を使いましたが、複数のレコードを取得したい場合はfetchall 関数を使います。
# select cursor.execute('select * from student_table') rows = cursor.fetchall() # 出力 for i in rows: print(i[0]) print(i[1]) print(i[2])
詰まったところ
上のコードでも使った
# insert cursor.execute('insert into student_table (name, sex) values (%s, %s)', (name, sex))
execute 関数の第1引数内の変数を %s とし、第2引数に変数を入れることで、特定の文字列をエスケープできるのですが、第2引数はタプルで表現しなければならないんですよ。
つまり、第二引数に変数を一つだけ与えたい場合、
(name)
や
name
ではエラーになってしまいます。
で、正解はこう。
(name,)
タプル恐ろしや。