rom

この記事はPython Advent Calendar 2014の6日目です。

romはPython製のRedisオブジェクトマッパーの一つで、よくあるオブジェクトリレーショナルマッパー(ORM)のパターンに非常に似たものになっています。

機能

  1. モデルを定義します
  2. クエリでとってきます

なんかどこかでみたことありますね。

モデルの定義

このようにしてモデルを定義します。

import rom

# All models to be handled by rom must derived from rom.Model
class User(rom.Model):
    email = rom.String(required=True, unique=True, suffix=True)
    salt = rom.String()
    hash = rom.String()
    created_at = rom.Float(default=time.time)

なんかどこかでみたことありますね。

クエリなど

定義したものはこのように使えます。

user = User(email='user@host.com')
user.salt, user.hash = gen_hash(password)
user.save()

user = User.get_by(email='user@host.com')
at_gmail = User.query.endswith(email='@gmail.com').all()

なんかどこかでみたことありますね。

ほか

  • モデルごとにデータベースを設定できるマルチデータベース
  • romで定義していないモデルへのForeignKey参照フィールド

どんなときに使えるのか

  • Redisが使える開発環境であり(必須) 、リレーショナルデータベースだとレイテンシが気になるとき
  • Redis上で単純なデータ構造以上のものを表現したいとき
  • DjangoのORMっぽいものをRedisバックエンドで使いたいとき

どうやって動いてるの

  • モデルデータはプライマリキーをキーにしたHashに入っています
  • モデルデータを検索可能にするためにSetやSortedSetに射影しています