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

declarativeプラグイン

Python SQLAlchemy

SQLAlchemyの0.4.4でdeclarativeというプラグインが追加され、ActiveRecordスタイルでテーブル、モデルを定義できるようになった。

declarative
http://www.sqlalchemy.org/docs/04/plugins.html#plugins_declarative


同じことは以前から、Elixirを使えばできたが、このdeclarativeプラグインはSQLAlchemyの作者であるMike Bayer自身が書いているということで興味深い。

次の例は、ある一人の飼い主がN匹の猫を飼っているという単純なモデルをdeclarativeプラグインを使って定義した例。

# -*- coding: utf-8 -*-
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('sqlite://', echo=true)
Base = declarative_base(engine)

class Owner(Base):
    # 飼い主。テーブル名はowner
    __tablename__ = 'owner'

    id   = Column('id', Integer, primary_key=True)
    name = Column('name', Unicode(100))

    # ownerはN匹のCatをもつ。catからはownerとして参照される
    cats = relation("Cat", backref="owner")

class Cat(Base):
    # 猫。テーブル名はcat
    __tablename__ = 'cat'

    id       = Column('id', Integer, primary_key=True)
    name     = Column('name', Unicode(100))

    # catは一人のownerを参照している
    owner_id = Column('owner_id', Integer, ForeignKey('owner.id'))

Base.metadata.create_all()

if __name__ == '__main__':
    # Sessionインスタンスをつくり
    sess = sessionmaker(transactional=True, autoflush=False, bind=engine)()

    # 飼い主
    owner = Owner()
    owner.name = u"Shota"
    sess.save(owner)

    # 猫
    cat = Cat()
    cat.name = u"Insight"
    owner.cats.append(cat)

    # ここでコミット
    sess.commit()

    # いったんこのセッション内でのオブジェクトを消去し
    # データベースから飼い主、猫を再取得する
    sess.clear()
    cat = sess.query(Cat).first()

    assert cat.name == u"Insight"
    assert cat.owner.name == u"Shota"


翔太と猫のインサイトの夏休み―哲学的諸問題へのいざない (ちくま学芸文庫)

翔太と猫のインサイトの夏休み―哲学的諸問題へのいざない (ちくま学芸文庫)