Как сделать полусоединение с помощью SQLAlchemy? - PullRequest
2 голосов
/ 31 марта 2010

http://en.wikipedia.org/wiki/Relational_algebra#Semijoin

Допустим, у меня есть две таблицы: A и B. Я хочу сделать запрос, который будет работать аналогично следующему оператору SQL, с использованием SQLAlchemy orm:

SELECT A.*
FROM A, B
WHERE A.id = B.id
AND B.type = 'some type';

Дело в том, что я пытаюсь разделить логику А и Б в разных местах. Поэтому я хотел бы сделать два запроса, которые я могу определить в разных местах: один, где A использует B как подзапрос, но возвращает только строки из A. Я уверен, что это довольно легко сделать, но пример был бы хорош если бы кто-то мог показать мне.

1 Ответ

2 голосов
/ 01 апреля 2010

Предположим, у вас есть классы моделей A и B, сопоставленные с соответствующими таблицами.

Самый простой случай, когда у вас есть отношение в A, указывающее на B, назовем его A.b. Затем вы просто используете A.b.has(type='some type') или A.b.any(type='some type') (в зависимости от того, является ли A.b скалярным или представляет коллекцию) в качестве условия при запросе A модели.

Но вы говорите, что пытаетесь разделить логин. Значит ли это, что такого отношения нет? Если это так, вы должны явно определить условие соединения:

session.query(A).join((B, A.id==B.id)).filter(B.type=='some type')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...