Xen/KVM Virtualization Management Application
  • 日本語
  • English

Karesansui Wiki


データベーステーブル(model.model)

※MVC別に分類します。

このページではMVCのデータベースに紐づくModelのリファレンスを紹介します。

※例文のコードは、karesansui/db/model/user.pyのプログラムを利用しています。


データベースモデル(model)

Karesansuiでは、様々なデータをデータベースに保存しています。ここでは、データベースをModel定義する方法を紹介します。

データベースモデル定義プログラムは、karesansui/db/modelフォルダ になります。
※テーブル別にファイルを分類しています。


O/Rマッパー(SQLAlchemy)について

Karesansuiでは、オープンソースのSQLAlchemyを利用しています。
SQLAlchemyはPythonで書かれたO/RマッパーでPostgreSQL、MySQL、SQLite、Firebirdなど複数のデータベースをサポート(KaresansuiのサポートデータベースはSQLAlchemyに準拠しています)しています。

詳しくはSQLAlchemyのドキュメントを参照ください

SQLAlchemyドキュメント


モデルを用意する

Karesansui からSQLAlchemyを使う場合、以下の3つを用意する必要があります。

  • モデル定義 : sqlalchemy.Tableクラスを利用し定義します。コンストラクタにデータベースのテーブルに合うカラム定義を行います。
    ※SQLAlchemyには、一般的なデータベースにある機能が相当数存在します。Karesansuiはそれらを制限しませんので、自由に利用することが可能です。
  • モデルクラス : アプリケーションで利用するモデルクラスを定義します。通常このクラスを利用しテーブルを操作します。
    ※Karesansuiではこの中に、get_json関数を用意し簡単にJSON形式でモデル出力する方法を提供しています。
    ※このクラスは、karesansui/db/model/__init__#Modelを継承してください。Karesansuiが用意した便利な関数を提供しています。
  • モデル定義とモデルクラスをマッピング : 上記のモデル定義とモデルクラスをマッピングします。
    ※マッピングを利用することで、複雑なリレーションや遅延ロードなどを設定することができます。


モデル作成手順

* karesansui/db/model/xxx.py(以後モデルファイル)を作成します。
※データベーステーブル単位にファイルを作成する事を推奨します。
※karesansui/db/model/user.pyを参考に記述してください。驚くほどシンプルな記述になっています。
example)user.py : モデル定義関数
def get_user_table(metadata, now):
    return sqlalchemy.Table('user', metadata,
                            sqlalchemy.Column('id', sqlalchemy.Integer,
                                              primary_key=True,
                                              autoincrement=True,
                                              ),
                            sqlalchemy.Column('email', sqlalchemy.String(256),
                                              unique=True,
                                              nullable=False,
                                              ),
                            sqlalchemy.Column('password', sqlalchemy.String(40),
                                              nullable=False,
                                              ),
                            sqlalchemy.Column('salt', sqlalchemy.Unicode(16),
                                              nullable=False,
                                              ),
                            sqlalchemy.Column('nickname', sqlalchemy.Unicode(16),
                                              nullable=False,
                                              ),
                            sqlalchemy.Column('languages', sqlalchemy.Unicode(6),
                                              default=u'ja_JP',
                                              ),
                            sqlalchemy.Column('created', sqlalchemy.DateTime,
                                              default=now,
                                              ),
                            sqlalchemy.Column('modified', sqlalchemy.DateTime,
                                              default=now,
                                              onupdate=now,
                                              ),
                            )

example)user.py : モデルクラス
class User(karesansui.db.model.Model):
    def __init__(self, email, password, salt, nickname, languages=None):
        self.password = password
        self.salt = salt
        self.email = email
        self.nickname = nickname
        self.languages = languages

    def get_json(self, languages):
        ret = {}
        ret["id"] = self.id
        ret["email"] = self.email
        #ret["password"] = self.password                                                                                                                                  
        #ret["salt"] = self.salt                                                                                                                                          
        ret["nickname"] = self.nickname
        ret["languages"] = self.languages
        ret["created"] = self.created.strftime(
            DEFAULT_LANGS[languages]['DATE_FORMAT'][1])
        ret["modified"] = self.modified.strftime(
            DEFAULT_LANGS[languages]['DATE_FORMAT'][1])

        return ret

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

example)user.py : モデルマッピング
def reload_mapper(metadata, now):
    t_user = get_user_table(metadata, now)
    mapper(User, t_user)
* karesansui/db/model/__init__#reload_mappers関数に上記で作成したマッピング関数を追記します。
※この追記によりKaresansuiに自動でマッピングされるようになります。
example)user.py : Karesansui定義マッピング
+    import karesansui.db.model.user
+    karesansui.db.model.user.reload_mapper(metadata, _now)

karesansui_mvc_model1.png (25.2 KB) funagayama kei, 11/15/2010 09:07 PM

karesansui_mvc_model.png (19.3 KB) funagayama kei, 11/15/2010 09:07 PM

Also available in: HTML TXT