2.11.2. compute

フィールドの書き込み時に動作するオプションです。これは Field クラスのコンストラクタに設定します。

computeオプションに関数を設定することによりレコード挿入時や更新時に、他のフィールド値などから計算した結果をフィールドに格納します。

このフィールドの典型的な利用方法として次の2点が挙げられます。

  • データ加工処理の負荷を軽減するため、HTMLタグなどの処理を予めしておきます。
  • 検索処理の負荷を軽減するため、簡単に検索可能な値に予め処理をしておきます。

具体的なサンプルを見ていきましょう。

db.define_table('inventory',
    Field('item'),
    Field('actual','decimal(10,2)'),
    Field('reserved','decimal(10,2)'),
    Field('free','decimal(10,2)',compute=lambda r : r['actual'] - r['reserved']))

テーブル定義で、フィールドfreeのcomputeオプションに無名関数(lambda)を登録しています。これは他のフィールド値を元に 無名関数が値を算出して、算出した値をフィールドに格納します。。

次に定義したテーブルを使ったサンプルを示します。

>>> row = db.inventory.insert(item=1,actual=150,reserved=35)
>>> print row.free
115.00

actualとreservedから計算した値が、freeに保存されているのがわかります。