Edited at

SQLAlchemy + MySQL を使ってみる(その1)

More than 3 years have passed since last update.

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(オライリー)」のサンプルをベースにコードを書いてみたところ、いろいろとハマったので注意点を書いておきます。


sqlalchemy_test.py

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」を付加すると日本語も使えるようになります。

[エラーメッセージ]

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 51-53: ordinal not in range(256)


SQL 文に「?」が使えない

SQL 文に「VALUES (?, ?, ?)」のように「?」が使えません。代わりに「%s」を使います。(SQLAlchemy のバグのようです。)

[エラーメッセージ]

TypeError: not all arguments converted during string formatting


スクリプトファイル名を「sqlalchemy.py」にしてはいけない

スクリプトファイル名を「sqlalchemy.py」にしてはいけません。またスクリプトファイルが置いてあるディクレクトリ内に「sqlalchemy.py」という名前のファイルがあってもいけません。

[エラーメッセージ]

AttributeError: module 'sqlalchemy' has no attribute 'create_engine'

SQLAlchemy + MySQL を使ってみる(その2)