2010-07-20 98 views
0
属性

我的模式看起来是这样的:多到一个在风暴

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不是唯一)

我该如何设置?

回答

2

对于给定的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") 
+0

看起来不错。我想我期望能够在Plan的某些属性中定义Plan.id == Project.plan_id关系,而不是显式地在find表达式中定义该关系,但这是有效的。 – keturn 2010-07-21 15:41:43

+0

那么,根据你的代码结构,将Reference或ReferenceSet属性添加到类中可能更适合你的需求。例如,如果您已经检索到相关的项目行,则可以通过“project.plan”访问计划,如果您将项目类的参考定义为: plan = Reference(plan_id,Plan.id) 但是,如果我从项目名称开始直接想要计划,那么单个find()语句将导致更少的查询。 – 2010-07-22 02:51:43