SQLAlchemyの設定

Pylonsはデータ永続層の仕組みを提供しない。が、OR Mapperの一種であるSQLAlchemyとの相性は良い。(pasterでプロジェクト設置した際に、SQLAlchemyを使うかどうか指定したでしょ→http://d.hatena.ne.jp/masayang/20100219/1266606799)

今回は開発環境なので、SQLAlchemyがデータをしまう仕組みはsqliteを使えば良い。本番ではMySQL、それもShardingしまくったものになるだろうが、今はそこまで考える必要はない。*1

development.ini

sqlalchemy.url = sqlite:///%(here)s/development.db

model/__init__.py

とりあえず、nameの一覧が検索できるようにしてみよう。RDB側ではnameおよびPhoneBookのidだけ持っておけば良い。

from sqlalchemy import schema, types

name_table = schema.Table('name', meta.metadata,
                          schema.Column('id', types.Integer,
                                       schema.Sequence('name_seq_id', optional = True),
                                       primary_key = True),
                          schema.Column('phone_id', types.String, nullable = False),
                          schema.Column('name', types.Unicode(255), nullable = False),
                          )

class Name(object):
    pass

orm.mapper(Name, name_table)

テーブルの生成

$ paster setup-app development.ini
 
Running setup_config() from phonebook.websetup
23:27:57,472 INFO  [sqlalchemy.engine.base.Engine.0x...4490] PRAGMA table_info("name")
23:27:57,473 INFO  [sqlalchemy.engine.base.Engine.0x...4490] ()
23:27:57,477 INFO  [sqlalchemy.engine.base.Engine.0x...4490]
CREATE TABLE name (
        id INTEGER NOT NULL,
        phone_id VARCHAR NOT NULL,
        name VARCHAR(255) NOT NULL,
        PRIMARY KEY (id)
)


23:27:57,477 INFO  [sqlalchemy.engine.base.Engine.0x...4490] ()
23:27:57,551 INFO  [sqlalchemy.engine.base.Engine.0x...4490] COMMIT

→gitコミット先: http://github.com/masayang/pylons-mdb/commit/959957705e2d9cd793f55a8e991486805ad16cce

目次に戻る

*1:なお、SQLAlchemyを使う限り、一本のsqliteにデータをしまおうが、100台のMySQLに水平分割して格納しようが、アプリケーションのコードには一切手を加える必要必要はない。Sessionの生成がかわるだけである。