2013-08-12 5 views
0

У меня есть отношение «один ко многим» между двумя типами объектов Сообщение и URL. Связь определяется в URL-адресе класса с помощью backref с именем «link», который указывает на Message. Есть ли способ сделать фильтр при запросе на Message, чтобы найти, например, сообщение, которое содержит менее n URL-адресов?Способ фильтрации с использованием backref «length» с SQLAlchemy

Я попытался с:

session.query(Message).filter(len(Message.link) < n).all() 

И

from sqlalchemy import func 
session.query(Message).filter(func.count(Message.link) < n).all() 

Каждый из них посылает меня ошибка. Первый из них:

InstrumentedAttribute has no len() 

Второе:

DatabaseError: (DatabaseError) ORA-00934: group function is not allowed here 

Благодаря Аудрюсом Kažukauskas и после некоторого пустячный мне удалось сделать следующий запрос:

session.query(Message.message_id)\ 
     .join(URL) 
     .group_by(Message.message_id) 
     .having(func.count(URL.url_id) <= n) 

Который работает отлично (отправьте обратно KeyedTuple вместо коллекции Message, но я могу жить с ним).

ответ

2

Для этого, чтобы работать, вы должны присоединиться к Message с URL, группы по всем полям в Message и сделать фильтрацию в HAVING пункте:

q = session.query(Message).\              
    join(URL).\                 
    group_by(Message).\               
    having(func.count(URL.id) < n) 

filter() (что переводится WHERE в SQL) применяется до группировки и агрегатных функций, в то время как having() фильтрует строки после группировка выполнена.

+0

Я получаю «DatabaseError: (DatabaseError) ORA-00932: непоследовательные типы данных: ожидается - получил ошибку NCLOB» при ее использовании (один из моих столбцов в сообщении имеет этот тип. – Ketouem

+1

И когда я помещаю group_by (Message. message_id) Я получаю хороший «DatabaseError: (DatabaseError) ORA-00979: не выражение GROUP BY» exception ..... – Ketouem

+0

Хм, это странно ... У меня нет опыта работы с Oracle, но мой запрос работает с обоими PostgreSQL и SQLite (даже после модификации 'group_by()', как вы это делали). Хотя я должен отметить, что модели, которые я создал для проверки запроса, были очень простыми. –

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