2.3. テーブルの継承

web2pyではテーブルの継承を使って、テーブル定義することが可能です。

テーブル定義の中に他のテーブルを指定することによって、そのテーブルのフィールド定義を含んだテーブルが作成できます。

サンプルを示してみます。

>>> db.define_table('animal', Field('name'))
>>> db.define_table('mouse', db.animal, Field('owner_id', db.person))

animal テーブルを継承して、mouseテーブルを作成しています。mouse テーブルには、nameフィールドとowner_idフィールドが設定されます。

この他、雛形となるテーブルはデータベースには作成しないで、雛形テーブルを継承したテーブルだけ作成する設定も可能です。

>>> def_animal = db.Table(db, 'animal', Field('name'))
>>> db.define_table('mouse', def_animal, Field('owner_id', db.person))

def_animal変数には、Tableインスタンスを生成して設定しています。それをmouseテーブル定義時に指定します。 animalテーブルはデータベースには作成されないですが、mouseテーブルは作成されます。

バリデータも継承したい場合は、テーブル継承の定義の前に、継承するテーブルのバリデータを定義することが必要です。

参考: Table Inheritanceテーブル継承

2.3.1. auth.signature

同様の定義は、Authでも特定の目的のために定義されています。

auth = Auth(db)
db.define_table('person', Field('name'), auth.signature)

これはテーブルに次のフィールド定義を付加します。

Field('is_active','boolean',default=True),
Field('created_on','datetime',
        default=request.now,
        writable=False,readable=False),
Field('created_by',
        reference_user,
        default=lazy_user,represent=represent,
        writable=False,readable=False,
        ),
Field('modified_on','datetime',
        update=request.now,default=request.now,
        writable=False,readable=False),
Field('modified_by',
        reference_user,represent=represent,
        default=lazy_user,update=lazy_user,
        writable=False,readable=False)

レコードの有効性・作成日時・作成者・変更日時・変更者といったフィールドを、テーブルに追加します。