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 使えば良さそう。