“人”数据库表本身没有自动创建任何内容。相反,表示给定人员记录的 DAL Row 对象包括一个 DAL Set 对象,该对象表示“dog”表中引用该人员的记录集。在代码中,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 的引用。在您调用select()
方法 via之前,不会对数据库进行任何查询db.person(1).dog.select()
,这将返回“dogs”表中的实际记录。