атрибуты многие-к-одному в Storm - PullRequest
0 голосов
/ 21 июля 2010

Моя схема выглядит примерно так:

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

И я хочу делать Storm-запросы в соответствии с

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 голосов
/ 21 июля 2010

Для данного 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")
...