"person" データベース テーブル自体には何も自動的に作成されませんでした。むしろ、特定の人物のレコードを表す DAL Row オブジェクトには、その人物を参照する「犬」テーブル内のレコードのセットを表す DAL Set オブジェクトが含まれます。コードでperson
は、 は Row オブジェクト (つまりdb.person(id)
) です。これには「dog」属性があり、次の DAL Set オブジェクトです。
db(db.dog.owner == person.id)
これは、この person.id を参照する犬のセットです。もしあなたがそうするなら:
>>> print db.person(1)
次のようなものが表示されます。
<Row {'name': 'John', 'update_record': <function <lambda> at 0x2b08758>,
'dog': <gluon.dal.Set object at 0x2b00d10>, 'id': 1,
'delete_record': <function <lambda> at 0x2b08b90>}>
そのため、レコードの「name」と「id」の値を含むことに加えて、Row オブジェクトには、この人物を参照する「dog」テーブル レコードを表す Set オブジェクトと同様update_record()
に関数が含まれます。delete_record()
その Set オブジェクトに関連付けられたクエリを出力すると、次のようになります。
>>> print db.person(1).dog.query
(dog.owner = 1)
したがって、Row オブジェクト自体に前方参照が作成されます。このdb.person(1).dog
属性は、クエリを定義する Set オブジェクトにすぎないことに注意してください。実際の「犬」テーブル レコードや ID への参照は含まれていません。「dogs」テーブルから実際のレコードを返すselect()
を介してメソッドを呼び出すまで、データベースに対してクエリは実行されません。db.person(1).dog.select()