Pythonのドライバがいくつもある件
どのドライバ使えばいいんだってばよ
なんでこんなにあるんだ
ここにいくつもある
で、日本語で情報が検索できたものとしてピックアップしたのがこのへん
- PyMySQL
- mysql-connector-python
- MySQL-Python
- mysqlclient
概要を表にしてみた
プロダクト | python2 | python3 | 備考 |
---|---|---|---|
PyMySQL | ○ | ○ | PyMySQL3ってのがあったけど今はこれ1本 |
mysql-connector-python | ○ | ○ | MySQL公式 |
MySQL-Python | ○ | × | Python3には使えない |
mysqlclient | × | ○ | 3を使えないMySQL-Pythonを3に対応したもの |
PyMySQL
PurePythonを謳うドライバ。ググるとだいぶ上位に出てくるので、まずは試そうかなという気持ちにさせられる。python2系とpython3系の両方に対応している。
mysql-connector-python
MySQL :: Download Connector/Python
公式によるドライバ。公式ってことはですよ、あのOracleのサポートでもあるんですよ。心強いですねぇ。これがドライバを試す初めの一歩にはいいと思います。
MySQL-Python
Index of Packages : Python Package Index
古株のドライバらしいんですけどね、python3には対応してないっていう。比較的新参pythonistaなので、僕はpython3を使っている。よってこれはお話になりませんという話。python3に対応するよって言いながらここ何年も進んでいない気がする。
mysqlclient
という事で業を煮やしたハッカーが、MySQL-Pythonからforkしていって、しまいにはpython3に対応したというオープンソースならではのプロダクト。WebフレームワークであるDjangoの推奨ドライバにもなっているので導入しておいて損はないかも。
まとめ
mysql-connector-pythonをメインに使って、適材適所で他のドライバを使うのがいいかと。サブとしてDjango用にmysqlclientも入れておくと隙が無い。
mysqlclientでCRUDする
というよりmysql-connector-pythonがインストールできなかった。
mysql-connector-pythonをpipからインストールしようとしたら下記のエラーが出た
Could not find a version that satisfies requirement mysql-connector-python(from versions: ) No matching distribution found for mysql-connector-python
残念だが君はバージョンを満たしてないようだね。というご宣託。
MySQL :: MySQL Connector/Python Developer Guide :: 3 Connector/Python Versions
公式リンクによるとpython3.3と書いてあるのでPython3.5の僕はアウトらしい。ということでmysqlclientをしばらく相棒にしようかと思う。インストールはpipで。
pip install mysqlclient
エラーがでるようならaptでライブラリを入れておく
sudo apt insatall libmysqlclient-dev
接続と終了
import MySQLdb con = MySQLdb.connect( user = "user", passwd = "pass", host = "yourhost", db = "yourdb") cur = con.cursor() cur.close con.close
以降はこの接続と変数を使うという前提です
Read(SELECT)
CRUDといいながらまずはセレクト
cur.execute("select * from tbl") for row in cur.fetchall(): print(str(row[0])) cur.close
Create(INSERT)
続いてINSERT
cur.execute("INSET INTO tbl(id, value) VALUES (1, 100)")
con.commit
cur.close
con.close
一括INSERTはこんな感じ。
cur.executemany("INSET INTO tbl(id, value) VALUES (%s, %s)", [(1, 100), (2, 200), (3, 300)]) con.rollback cur.close con.close
Update
なんかSQLさえ流せればという感じがしてきた。
cur.execute("UPDATE tbl SET value=400 WHERE id = 2")
con.commit
cur.close
con.close
Delete
結局これも。
cur.execute("DELETE FROM tbl WHERE id = 3")
con.rollback
cur.close
con.close
まとめ
途中でも書いたけど、SQLさえかければという感じがする。というよりRDBのドライバに求められているのって結局それなんでしょうね。あとはJavaでいうところのPreparedStatement#addBatch()みたいなやつが欲しいんだけどなぁ。どうだろ?Documentを探せばあるかな。
Welcome to MySQLdb’s documentation! — MySQLdb 1.2.4b4 documentation