2014/05/01

ライブラリ:peewee

Pythonの「 peewee 」というライブラリについてご紹介します。

from peewee import *

peewee はPythonでデータベースを扱いやすくするためのライブラリーーいわゆる「ORマッパ」ライブラリです。デフォルトではPosgreSQL、MySQL、SQLiteの3つに対応しており、Ruby on RailsのActiveRecordに似たインタフェースを提供しています。

以下、peeweeの基本的な使い方をひととおり見ていきます。


データベースへの接続

データベースへの接続は、***Databaseというクラスを使って行います。
# データベースを指定して接続
db = SqliteDatabase('db.sqlite')
db.connect()

# さまざまな処理...

# データベース接続を閉じる
db.close()

これはSqliteの場合です。ほかのDBMSの場合はそれに対応したクラスを使います。


モデルの定義

# データベース指定のための設定を格納したベースモデル
class BaseModel(Model):
    class Meta:
        database = db

# モデル Person
# person テーブルに対応する
# カラムとして name birthday を持つ
# データベースの指定は BaseModel を継承する形で行う
class Person(BaseModel):
    name = CharField()
    birthday = DateField()

    def __unicode__(self):
        return self.name


テーブルの作成

# Person クラスに対応した person テーブルを作成する
def create_tables():
    Person.create_table()

create_tables()

この create_table とは逆に、存在するテーブルを削除するメソッドは drop_table です。


レコードの追加 (C in CRUD)

# Person クラスのインスタンスを生成し
# save メソッドでデータベースへ登録する
from datetime import date

def create_person(name, birthday):
    new_person = Person(name=name,
                        birthday=date(*birthday))
    return new_person.save()

create_person(name="name", birthday=(2014, 5, 5))


レコードの取得 (R in CRUD)

# 条件にマッチしたものを1件だけ取り出す
saigo = Person.get(Person.name == 'Saigo')
print saigo.name  # => Saigo

# 条件にマッチしたものを複数件取り出す
saigo_family = Person.filter(Person.name == 'Saigo').execute()
for s in saigo_family:
    print s.name,
# => Saigo Saigo Saigo...

get メソッドは条件にマッチしたものを1件だけ抽出します。後者の filter メソッドと execute メソッドの組み合わせでは、条件にマッチしたものを複数件抽出してきます。 filter で条件を決めてクエリ文を生成し、 execute で実際にデータベースに接続する、といった形です。

ちなみに、 filter で条件を決めたあとに直接 execute でデータベースにアクセスする前に order_by join limit などのメソッドでクエリ文をさらに細かく設定することももちろん可能です。


レコードの削除 (D in CRUD)

# すでにインスタンス化されたレコードを削除する
a_record.delete_instance()

# 条件にマッチしたものをすべて削除する
Person.delete().filter(Person.name == 'Saigo').execute()

delete_instance はすでにインスタンス化されたレコードを削除します。一方で、 delete のあとに filter などで条件を設定し execute とすると、条件にマッチしたものがすべて削除されます。


レコードの更新 (U in CRUD)

# すでにインスタンス化されたレコードを更新する
a_record.name = "new name"
a_record.save()

# 条件にマッチしたものをすべて更新する
Person.update(name = "Saigoh").filter(Person.name == 'Saigo').execute()

save は インスタンス化されたレコードを更新します。一方で、 update のあとに filter などで条件を設定し execute とすると、条件にマッチしたものをすべて update 内の式のとおりに更新します。

以上です。


この他にも、データベース操作をかんたんにしてくれるさまざまなメソッドが用意されています。

詳しくは公式ドキュメントを参照してみてください。


インストール

pip が入っていればインストールは pip から行えます。
$ pip install peewee


参考
SQLAlchemyとpeeweeの比較 - kk6のメモ帳*
紹介マニアどらふと版: Python の ORM 調査:結論
Welcome to Peewee, a lightweight python ORM - IPython Notebook Viewer
peewee - Python is Simple
coleifer/peewee - GitHub
peewee — peewee公式ドキュメント

0 件のコメント: