LoginSignup
48
48

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-05-29

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)

48
48
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
48
48