モデルの構築

まず最初にTurbogearsが利用するデータベースカスタマイズをします。もし、データベースを利用しないならば次のセクションに行きます。

"dev.cfg"を開いてあなたが使うデータベースの適切なコメントラインの場所を探します。
このチュートリアルではSQLiteを利用します。理由はサーバコネクトの代わりにローカルファイルを利用するので操作が容易だからです。

sqlobject.dburi = "sqlite:///home/brian/tutorial/tutorial.sqlite"

Note SQLiteを利用する場合はURI絶対パスである必要があります。もちろんSQLiteがインストールされている必要もあります。

"dev.cfg"を閉じます。チュートリアルの終わりまで、これを変更することはないです。

データベーステーブルを定義します。既にある tutorial/model.py のファイルを開きます。
TurboGearsはデータベースの抽出にSQLObjectを利用します。SQLObjectの中では、クラスはテーブルをあらわし、クラスのアトリビュートはテーブルの列をあらわします。
To-Doリスト アプリケーションを作成するわけですから、tutorial/model.pyに次のようなクラスを加えます。

class User(SQLObject):
    email = StringCol(alternateID=True)
    lists = MultipleJoin('List')

class List(SQLObject):
    title = UnicodeCol(notNone=True)
    user = ForeignKey('User')
    items = MultipleJoin('Item')

class Item(SQLObject):
    value = UnicodeCol(notNone=True)
    list = ForeignKey('List')

このモデル内では、ユーザはユニークなE-mailアドレスと複数のリストを持つことができる。リストは表題を持ち、一つのオーナーと複数のアイテムを持つ。アイテムは値とそれらを含むリストです。

テーブルの定義と利用のために、SQLObjectのドキュメンテーションを参照します。

http://sqlobject.org/SQLObject.html

dev.cfg内にTurboGearsがデータベースで使う新しいテーブル定義の情報があります。
テーブルの作成には次を実行します。

$ tg-admin sql create

エラーが出なければテーブル作成は成功です。

テーブル定義に変更が必要な場合、現在のデータベースのものを捨てます。そして、テーブルを再作成します。*1

$ tg-admin sql drop  <--- DB削除
$ tg-admin sql create <---DB作成

テーブルを作り終えた後、プロジェクトにあるPython Shellでインタラクティブに行の追加をテストします。
Shellをスタートさせます。

$ tg-admin shell

トランザクション内でデータを追加か修正をします。コミットなしでシェルを抜けるとデータベースには保存されません。
トランザクションのコミットには、データを変更後、シェルで次のようにタイプします。

>>> hub.commit()

インタラクティブなシェルを使ってテーブルをテストします。順序に従ってデータベースにいくつかのアイテムをinsertをします

>>> u1 = User(email="exogen@gmail.com")
>>> u1.email
'exogen@gmail.com'

>>> u1.id
1

>>> u1.lists
[]

>>> l1 = List(title="Groceries", user=u1)
>>> l1.title
u'Groceries'

>>> l1.user
<User 1 email='exogen@gmail.com'>

>>> l1.user.email
'exogen@gmail.com'

>>> l1.items
[]

>>> u1.lists
[<List 1 title=u'Groceries' userID=1>]

>>> i1 = Item(list=l1, value="Milk")
>>> i2 = Item(list=l1, value="Eggs")
>>> i3 = Item(list=l1, value="Bread")
>>> [item.value for item in l1.items]
[u'Milk', u'Eggs', u'Bread']

>>> len(l1.items)
3

セーブするためにコミットすることを忘れないでください。

>>> hub.commit()

テーブルが十分に動いたなら、model.pyを閉じてください。

今後、チュートリアルの終わりまで変更する必要はないです。

*1:tg-admin sql createでは、既にtableがある場合でもエラーなく実行できる。データが入っていた場合にはどうなるんだろ??