SQLAlchemyが思いのほか使えない

SQLAlchemyを使うと、データベースドライバ毎の差異を吸収してくれる(らしい)。

つまり、使用するデータベースが変わっても、SQLAlchemyの関数呼び出し時の引数をほんの少しだけ変えればいい(らしい)。

まずは、インストール。

$ pip install sqlalchemy

オライリーの『入門Python 3』を読みながら実験開始したところ、様々なトラブルに見舞われました。

まず、SQLiteを使ってこちらのサンプルスクリプトを実行しました。

import sqlalchemy as sa

conn = sa.create_engine('sqlite://') # (A)
meta = sa.MetaData()
zoo = sa.Table('zoo', meta,
               sa.Column('critter', sa.String, primary_key=True), # (B)
               sa.Column('count', sa.Integer),
               sa.Column('damages', sa.Float)
)
meta.create_all(conn)

これは、ちゃんと動きました。
次に、MySQLに接続してみます。
(A)を以下のように変更します。

conn = sa.create_engine('mysql+pymysql://ユーザー名:パスワード@localhost/データベース名?charset=utf8')

ところがエラー発生!

〜省略〜
sqlalchemy.exc.CompileError: (in table 'zoo', column 'critter'): 
VARCHAR requires a length on dialect mysql

「MySQLの方言には、VARCHAR型は長さ(length)が必要である」
とおっしゃっておるようです。

しかし、lengthの指定ってどこでやればいいんでしょうかね。
青汁のCMを思い浮かべながら調査していると、こちらのサイトに遭遇しました。

どうやら、Column関数で指定するようです。
そこで(B)行を次のように修正してやりました。

sa.Column('critter', sa.String(20), primary_key=True),

こんどは動きました。
ちなみに、上の変更を施した状態でSQLiteに接続してもうまくいきました。

それにしても、SQLAlchemyってデータベース毎の差異を吸収するものだと思ってたんですが、けっこうめんどうな気がします。 🙁

あらかじめ、使用するデータベースを固定しておいた方が、後で苦労しないかもしれません。

Pythonプログラミング物語 © 2016 Frontier Theme