多到一个在风暴
问题描述:
属性
我的模式看起来是这样的:多到一个在风暴
CREATE TABLE plans (
id SERIAL PRIMARY KEY,
description text
);
CREATE TABLE projects (
id SERIAL PRIMARY KEY,
project_id character varying(240) UNIQUE,
plan_id integer REFERENCES plans(id) ON DELETE CASCADE
);
我想要做的风暴查询沿
plan = store.find(Plan, Plan.project_id == "alpha")
# should translate to something like
# SELECT p.* from plans p LEFT JOIN projects proj ON p.id = proj.plan_id
# WHERE proj.project_id = 'alpha';
线(注意projects.plan_id
不是唯一)
我该如何设置?
答
对于给定的SQL,没有太多理由使用左连接,因为where子句不会匹配没有相应项目的任何行。你可以得到结果:
result = store.find(Plan, Plan.id == Project.plan_id, Project.project_id == "alpha")
这会给你一个ResultSet对象。鉴于您的架构,它看起来像你期待单行,这样你就可以访问具有:
plan = result.one()
或用绑在一起,他们两个:
plan = store.find(Plan, Plan.id == Project.plan_id, Project.project_id == "alpha").one()
如果你真的需要做左连接,语法是这样的:
result = store.using(LeftJoin(Plan, Project, Plan.id == Project.plan_id)).find(
Plan, Project.project_id == "alpha")
看起来不错。我想我期望能够在Plan的某些属性中定义Plan.id == Project.plan_id关系,而不是显式地在find表达式中定义该关系,但这是有效的。 – keturn 2010-07-21 15:41:43
那么,根据你的代码结构,将Reference或ReferenceSet属性添加到类中可能更适合你的需求。例如,如果您已经检索到相关的项目行,则可以通过“project.plan”访问计划,如果您将项目类的参考定义为: plan = Reference(plan_id,Plan.id) 但是,如果我从项目名称开始直接想要计划,那么单个find()语句将导致更少的查询。 – 2010-07-22 02:51:43