Python で MySQL を使いたいと思います。
Python の O/R マッパーを探してみたところ、SQLAlchemy が有名なようなので、今回はこれを使います。
公式のチュートリアルは英語ですが、丁寧に日本語で解説してくださっているブログがありましたので、こちらも参考にしながら進めていきます。
公式チュートリアル
http://docs.sqlalchemy.org/en/latest/orm/tutorial.html
Symfowareについての考察blog>SQLAlchemyの使い方1 単一テーブルのマッピングとデータの追加
http://symfoware.blog68.fc2.com/blog-entry-1373.html
動作環境
- Mac OS X 10.11.5
- Python 3.5.1
- MySQL Ver 14.14 Distrib 5.7.11, for osx10.11 (x86_64) using EditLine wrapper
- SQLAlchemy 1.1.0
- PyMySQL 0.7.4
事前準備
SQLAlchemy をインストール
$ pip install sqlalchemy
PyMySQL(MySQL ドライバ)をインストール(まだ Python 3.x 系に対応していない DB ドライバもあるようなので、選定する際は要注意!)
$ pip install PyMySQL
コードを書いてみる
最初に「入門 Python 3(オライリー)」のサンプルをベースにコードを書いてみたところ、いろいろとハマったので注意点を書いておきます。
import sqlalchemy as sa
url = 'mysql+pymysql://root:@localhost/test_db?charset=utf8'
engine = sa.create_engine(url, echo=True)
engine.execute('DROP TABLE zoo')
engine.execute('CREATE TABLE zoo (critter VARCHAR(20) PRIMARY KEY, count INT, damages FLOAT)')
# SQL文に「?」が使用できないので、代わりに「%s」を使用
ins = "INSERT INTO zoo (critter, count, damages) VALUES (%s, %s, %s)"
engine.execute(ins, "あひる", 10, 0.0)
engine.execute(ins, "くま", 2, 1000.0)
engine.execute(ins, "いたち", 1, 2000.0)
rows = engine.execute('SELECT * FROM zoo')
for row in rows:
print(row)
日本語を使いたい
create_engine 関数の引数 url に「?charset=utf8」を付加すると日本語も使えるようになります。
[エラーメッセージ]
SQL 文に「?」が使えない
SQL 文に「VALUES (?, ?, ?)」のように「?」が使えません。代わりに「%s」を使います。(SQLAlchemy のバグのようです。)
[エラーメッセージ]
スクリプトファイル名を「sqlalchemy.py」にしてはいけない
スクリプトファイル名を「sqlalchemy.py」にしてはいけません。またスクリプトファイルが置いてあるディクレクトリ内に「sqlalchemy.py」という名前のファイルがあってもいけません。
[エラーメッセージ]