Storm中的多对一属性

0 投票
1 回答
576 浏览
提问于 2025-04-16 01:36

我的数据结构大概是这样的:

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 这个值并不是唯一的。)

我该怎么设置呢?

1 个回答

2

对于这个SQL语句,其实没有太大必要使用左连接,因为你的条件语句不会匹配到没有对应项目的行。你可以用下面的方式来获取结果:

result = store.find(Plan, Plan.id == Project.plan_id, Project.project_id == "alpha")

这样会给你一个结果集对象。根据你的数据库结构,看来你是期待得到一行数据,所以你可以用下面的方式来访问它:

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")

撰写回答