Невозможно получить требуемые данные от многих до многих отношений в SqlAlchemy [duplicate]

Имейте в виду, что независимо от сценария причина всегда одинакова в .NET:

Вы пытаетесь использовать ссылочную переменную, значение которой Nothing / null. Если для ссылочной переменной значение Nothing / null, это означает, что на самом деле оно не содержит ссылку на экземпляр любого объекта, который существует в куче.

Вы либо никогда не присваивали какую-либо переменную, никогда не создавали экземпляр значения, присвоенного переменной, или вы вручную устанавливали переменную, равную Nothing / null, или вы вызывали функцию, которая установите для этой переменной значение Nothing / null.

16
задан CoreDumpError 25 June 2011 в 01:25
поделиться

3 ответа

Хорошо, после многих исследований я понял, что это мое собственное незнание терминологии SQL, которая удерживала меня. Мой поиск решения для поиска пользователей, принадлежащих к «хотя бы одному из» списка групп, должен был найти пользователей, принадлежащих к «любому» из списка групп. Функция any ORM от SQLAlchemy делает именно то, что мне нужно, например:

session.query(ZKUser).filter(ZKUser.groups.any(ZKGroup.id.in_([1,2,3])))

Этот код испускает этот SQL (в MySQL 5.1):

SELECT * FROM users 
WHERE EXISTS (
    SELECT 1 FROM user_groups, groups 
    WHERE users.id = user_groups.contact_id 
        AND groups.id = user_groups.group_id 
        AND groups.id IN (%s, %s, %s)
    )
31
ответ дан CoreDumpError 23 August 2018 в 15:51
поделиться

В соответствии с документами для any запрос будет работать быстрее, если вместо этого использовать явный join:

. Поскольку any () использует коррелированный подзапрос, его производительность не так хороша при сравнении с большими целевыми таблицами, как с использованием соединения.

В вашем случае вы можете сделать что-то вроде:

users = (
    session.query(ZKUser)
    .join(user_groups)
    .filter(user_groups.columns.group_id.in_([1, 2, 3]))
)

Это испускает SQL:

SELECT *
FROM users
JOIN user_groups ON users.id = user_groups.user_id 
WHERE user_groups.group_id IN (1, 2, 3)
4
ответ дан z0r 23 August 2018 в 15:51
поделиться

Вы можете использовать in_:

session.query(ZKUser).filter(ZKGroup.id.in_([1,2])).all()
0
ответ дан zeekay 23 August 2018 в 15:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: