読者です 読者をやめる 読者になる 読者になる

いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

SQLAlchemy入門記-02 (エンジンの作成およびメタデータの作成)

python

前回インストールを済ませましたので、いよいよ使用してみましょう。
SQLAlchemyでは、以下2つの方法でデータベースにアクセスできます。

  • テーブルそのものを表すオブジェクト(テーブルオブジェクト)
  • ドメインオブジェクト(つまり、テーブルオブジェクトと普通のクラスをマッピング)

まずは、テーブルオブジェクトの利用から始めます。


てことで、データベースを用意しなくてはならないのですが
最新版のpython(バージョン2.5)には、はじめからsqlite3というデータベースが付いてきています。
なので、ちょこっと動作を試す分にはデータベースを他からインストールする必要はありません。


以下は、SQLAlchemyを利用する上での操作イディオムです。

  1. エンジンを作成
  2. メタデータを作成
  3. テーブルオブジェクトを作成し利用
  4. ドメインオブジェクトを作成し利用(オプショナル)


基本的に、ドメインオブジェクトを利用しなくてもテーブルオブジェクトだけで
全ての操作を行うことができます。でも、其の場合はデータベーステーブルを直接
操作する感じになるのでなるべくデータ操作部分は見えないようにもう一層かますべきでしょう。


てことで、今回は上記の手順に従ってメタデータまでを作成してみます。
まずは、エンジン作成。エンジンは内部でコネクションを保持したりする大事な役割を持ったオブジェクトです。
データベースには、内臓しているsqlite3のメモリーデータベースを使用します。

import sqlalchemy as sqlal

_engine = sqlal.create_engine('sqlite:///:memory:')

これで、sqlite用のエンジンが作成されました。
さらに、出力されるSQL文を見たりしたい場合は以下のようにします。

_engine.echo = True

エンジンの作成は以上です。基本的にデータベース毎に変わるのが
URLの部分くらいで後は同じです。SQLAlchemyが対応しているデータベースに
ついては、本家のドキュメントを参照してください。

つづいて、メタデータの作成です。
以下のようになります。

_meta = sqlal.BoundMetaData(_engine)

これで特定のエンジンに紐づいたメタデータが作成されました。
メタデータは、特定のエンジンを内包し、データのやり取りの部分を吸収します。
橋渡しをする奴みたいな感じですね。
ちなみに、メタデータとエンジンは大抵セットで作成するので
ショートカットのコンストラクタが用意されています。

_meta = sqlal.BoundMetaData('sqlite:///:memory:')

この方法の場合は、自動的にエンジン付きのメタデータが作成されます。
上記の手順(1)(2)をワンステップで行えます。
さらに、

_meta = sqlal.BoundMetaData('sqlite:///:memory:', echo=True)

とすると、エンジンのechoプロパティがTrueになります。
よく利用するのが以下のパターンです。

_meta = sqlal.BoundMetaData('sqlite:///:memory:', echo=True, strategy='threadlocal')

特定のエンジンを紐付け、echoをONにし、さらにコネクションの管理方法をスレッドローカルに
します。スレッドローカルというのは、簡単にいうとコネクションを要求した場合に
同じスレッド内は一つの同じコネクションが取得できるという感じです。デフォルトでは
strategyの値は'plain'となっています。こちらは要求するたびに新たなコネクションが
取得されます。


今回は、以下の状態でメタデータを作成したとします。

_meta = sqlal.BoundMetaData(_engine)


最後に接続できることを確認しておきましょう。

_conn = _meta.engine.connect()
str(_conn)

上記でエラーが出る場合は、URLの指定などが間違っています。
正常に、sqlalchemy.engine.base.Connectionオブジェクトが取得できたら
オッケイです。


実は、コネクションが取得できたってことは当たり前ですが全ての操作ができます。

_conn.execute('select current_time').fetchone()

とやると、実際にselect文が発行できます。


とりあえず、メタデータまでは作成できました。
次は、テーブルオブジェクトを生成して操作してみます。