当子表引用父表时,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 会自动创建前向引用吗?的主要内容,如果未能解决你的问题,请参考以下文章

mysql外键级联更新删除

子表,父表;一对多,多对一;主键,外键梳理。

使用 AJAX 的 DataTables 中的子行

将值插入到从父表引用的子表中

什么是父表和子表

MySQL中利用外键实现级联删除更新