モデルを定義する

モデルはアプリケーションでどんなデータが使われるのかを表現しています。TurboGearsのモデルはふつうSQLObjectのオブジェクトとなります。SQLObjectはPythonオブジェクトとリレーショナルデータベースの橋渡しをしてくれます。データベースを100%完全に隠すようにはデザインされていませんが、ほとんどPythonを書くだけで、SQLについて頭を悩ませることはないでしょう。

TurboGears?がデータベースにアクセスする前に、どこにデータベースがあるかを教えてあげる必要があります。これは dev.cfg ファイル(開発環境の場合)、あるいは prod.cfg ファイル(プロダクション環境の場合)にて行います。このファイル内の sqlobject.dburi という設定パラメータがデータベースの在処を制御しており、基本的にはURIスキーマによって決定されます。

また接続URI( sqlobject.dburi )に "クエリパラメータ" を付与することでオプションを渡すこともできます。便利なオプションとしては debugdebugOutput があります。URIに ?debug=1 を付与するとそれぞれのクエリが出力されます。また &debugOutput=1 を付与するとクエリの結果が表示されます。

データのモデルは、プロジェクトパッケージ内の model.py モジュールで定義することができます。もし分割した方がよいモデルコードがあるならば、それを複数モジュールに分割して model モジュールで import すればOKです。

SQLObject?はデータベースを定義する2つの方法を提供してくれます: データベースに直接SQLで定義することもできますし、Pythonで定義することもできます。コードを明白にしておくためにも、Pythonで定義した方が簡単で良いでしょう。あなたが 本当に データベースに基づいたPythonクラスが欲しいのならば、こうするだけです:

from sqlobject import *

class Book(SQLObject):
    class sqlmeta:
        fromDatabase = True

これはいくつかのデータベースでのみ動作するということに注意してください。これがうまくいくか確認するためにはSQLObjectの Automatic Class Generation のドキュメントをチェックしてください。

モデルをPythonで定義するにはさらにPythonのコードを追加する必要がありますが、その代わりSQLをかかずにすみます。以下はPythonコードで書いた本のデータの例です:

class Book(SQLObject):
    isbn = StringCol(length=13, alternateID=True)
    title = StringCol(length=100)
    description = StringCol()
    authors = RelatedJoin('Author')

class Author(SQLObject):
    last_name = StringCol(length=40)
    first_name = StringCol(length=40)
    books = RelatedJoin('Book')

これをデータベースに作成するには、ただ以下のように実行するだけです:

tg-admin sql create

これによって 3つ のテーブルがデータベースに作成されます: 一つは本のテーブル、一つは著者のテーブル、そしてもう一つは多対多のリレーションのためのjoinテーブルです。

SQLObject?すべての データベースのモデルを作ることができるわけではありませんが、多くの種類のデータベースを扱えます。例えばカラムの名前やテーブルの名前、あるいはjoinテーブルの名前など、データベースがどのように利用されるのかといった側面に関しては既存のデータベースに応じてカスタマイズ可能です。

モデルオブジェクトは間抜けなデータコンテナとなる必要はありません。(そしてそうあるべきではありません!)モデルオブジェクトはPythonオブジェクトであり、様々な複雑な計算や操作を行うためのメソッドを持つことができるのです。

SQLObject?でデータモデルを定義することに関してはさらなる情報が SQLObject?のドキュメント にあります。

Previous: 引数を使いたい! : Next: モデルを使う