Orator という ORM

Orator という ORM があったので試してみた。


サイトには "The Orator ORM provides a simple yet beautiful ActiveRecord implementation. " とある。
ActiveRecord パターンで、PHP の Laravel framework からインスパイアされて、もっと Pythonic にしたって書いてあった。
早速試してみた。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from orator import DatabaseManager, Model

config = {
    'mysql': {
        'driver': 'mysql',
        'host': 'localhost',
        'database': 'dbname',
        'user': 'username',
        'charset': 'utf8',
        'password': 'password',
        }
    }

db = DatabaseManager(config)
Model.set_connection_resolver(db)


class Item(Model):
    __table__ = 'items'


if __name__ == '__main__':
    items = Item.all()
    for item in items:
        print(item.title)

DB のコネクションを作って、モデルにセットして、モデルクラスを定義して、そこから取得してみた。
簡単に取れた。


クエリビルダを使う場合こんな感じ。

rows = db.table('items').where('name', 'foo').get()
    for r in rows:
        print(r['name'])

ORM らしく簡単。


リレーションも勿論出来そうだし、スキーマーのマイグレーションツールも備わってる。
さらには Flask の 拡張も別プロジェクトにあるので、Flask から簡単に使えそう。
Paginator や Cache とかもあったりするので、これ一つで結構な事が出来そう。


ただし utf8 な文字列が入っているデータを取った際に正しく取得できなかった。
色々しらべると、charset を設定しているのに、これが無視されて、PyMySQL でコネクションを確率した際に charset が laten1 になってた。
原因を調べて、Pull Request 出したら、マージしてくれた。
2015/11/15 現在は GitHub の develop ブランチにマージされただけなので、そのうち PyPi にアップロードされると思う。


Python で ORM といえば SQLAlchemy がそびえ立っていて、これを使えば何の問題もないけど、ユースケースによっては大げさすぎるというのがある。
単純なサイトだけど、PyMySQL だとちょっとだるくて、SQLAlchemy だと大げさすぎるという感じの場合に、Orator 使えば良さそう。