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

SQLAlchemyとpeeweeの比較

とりあえず導入部分だけざっくりと。

データベースへの接続

SQLAlchemy
from sqlalchemy import create_engine
engine = create_engine('sqlite:///:memory:', echo=True)
peewee
from peewee import SqliteDatabase
engine = SqliteDatabase('db.sqlite')
engine.connect()

peeweeでsqlite:///:memory:する方法はめんどくさくて調べてません...

※2012.1.15 追記
peewee.SqliteDatabase(":memory:")でいけた

モデルの定義

SQLAlchemy
from sqlalchemy import Column, Integer, String, BOOLEAN
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    username = Column(String)
    password = Column(String)
    active = Column(BOOLEAN)

    def __init__(self, username, password):
        self.username = username
        self.password = password
        self.active = True

    def __repr__(self):
        return "<User('%s', '%s')>" % (self.username, self.password)

primary_keyは自動生成されないので自身で定義。
コンストラクタはdefaultで提供されているが、上記のようにオーバーライド可能。

peewee
import peewee
class Base(peewee.Model):
    class Meta:
        database = engine

class User(Base):
    username = peewee.CharField()
    password = peewee.CharField()
    active = peewee.BooleanField(default=True)

データベース・テーブルの作成

SQLAlchemy
Base.metadata.create_all(engine)
peewee
User.create_table()

クラスにマッピングされたインスタンスを生成

SQLAlchemy
>>> kk6 = User('kk6', 'kk6password')
>>> kk6.username
'kk6'
>>> kk6.password
'kk6password'
peewee
>>> kk6 = User.create(username='kk6', password='kk6password')
>>> kk6.username
'kk6'
>>> kk6.password
'kk6password'

peeweeの場合は

User.create(cls, **query)

という実装になっているのでキーワード引数を指定してやる。

データベースへの書き込み

SQLAlchemy
>>> from sqlalchemy.orm import sessionmaker
>>> Session = sessionmaker(bind=engine)
>>> session = Session()
>>> session.add(kk6)
peewee
>>> kk6.save()

データベースの参照

SQLAlchemy
>>> output = session.query(User).filter_by(active=True).first()
>>> output
<User('kk6', 'kk6password')>
peewee
>>> output = User.filter(active=True)
>>> output.get(username='kk6')
<User: <kk6>>