У меня есть отношение «один ко многим» между двумя типами объектов Сообщение и 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, но я могу жить с ним).
Я получаю «DatabaseError: (DatabaseError) ORA-00932: непоследовательные типы данных: ожидается - получил ошибку NCLOB» при ее использовании (один из моих столбцов в сообщении имеет этот тип. – Ketouem
И когда я помещаю group_by (Message. message_id) Я получаю хороший «DatabaseError: (DatabaseError) ORA-00979: не выражение GROUP BY» exception ..... – Ketouem
Хм, это странно ... У меня нет опыта работы с Oracle, но мой запрос работает с обоими PostgreSQL и SQLite (даже после модификации 'group_by()', как вы это делали). Хотя я должен отметить, что модели, которые я создал для проверки запроса, были очень простыми. –