当子表引用父表时,web2py 的 DAL 会自动创建前向引用吗?
Posted
技术标签:
【中文标题】当子表引用父表时,web2py 的 DAL 会自动创建前向引用吗?【英文标题】:does web2py's DAL automatically create forward references when a child table references the parent? 【发布时间】:2012-08-01 21:28:05 【问题描述】:以下信息来自web2py book的第270页:
person = db.person(id)
for dog in person.dog.select(orderby=db.dog.name):
print person.name, 'owns', dog.name
在最后一个表达式中,person.dog
是一个快捷方式
db(db.dog.owner==person.id)
现在:
本书没有引用定义person
表的部分,我不相信该表的任何先前定义实际上有dog
列。如果 person 表确实有一个 dog
列,那就没有意义了,因为大概一个人可以养很多条狗。
那么他们是说从dog
表到人员的引用自动创建了从人员到dog
的前向引用,而person
中没有任何明确的列?
【问题讨论】:
【参考方案1】:“person”数据库表本身没有自动创建任何内容。相反,表示给定人员记录的 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 对象还包括 update_record()
和 delete_record()
函数以及表示引用此的“dog”表记录的 Set 对象人。如果您打印与该 Set 对象关联的查询,您会得到以下信息:
>>> print db.person(1).dog.query
(dog.owner = 1)
因此,前向引用是在 Row 对象本身中创建的。请注意,db.person(1).dog
属性只是一个定义查询的 Set 对象——它不包含实际的“dog”表记录,甚至不包含对其 id 的引用。在您通过db.person(1).dog.select()
调用select()
方法之前,不会对数据库进行任何查询,这将返回“dogs”表中的实际记录。
【讨论】:
以上是关于当子表引用父表时,web2py 的 DAL 会自动创建前向引用吗?的主要内容,如果未能解决你的问题,请参考以下文章