2010-07-20 3 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.id == Project.plan_id в некотором атрибуте в Plan, а не явно в выражении find, но это работает. – keturn

+0

Ну, в зависимости от того, как вы структурируете свой код, добавление свойств Reference или ReferenceSet к вашим классам может лучше соответствовать вашим потребностям. Например, если вы уже получили соответствующую строку Project, вы можете получить доступ к плану как «project.plan», если вы определили ссылку на класс Project как: plan = Reference (plan_id, Plan.id) Но если бы я начинал с имени проекта и хотел, чтобы план был напрямую, то одно действие find() будет приводить к меньшему количеству запросов. –

Смежные вопросы