Сравнение двух записей базы данных с sqlalchemy - PullRequest
0 голосов
/ 07 декабря 2011

У меня есть таблица Users с отношением один-ко-многим на столе Visits (у каждого User было два Visits).В Visits указано несколько столбцов, включая Score.Для каждого User я бы хотел рассчитать разницу в их Score между двумя Visits.

Какой самый разумный способ сделать это с помощью SQLAlchemy?Вместо того, чтобы вычислять разницу непосредственно в вызове базы данных, я бы хорошо потянул Score для каждого Visit, предполагая, что они уже сопоставлены через одного и того же пользователя.Тогда это просто Score1-Score2.

Примечание: просто вытащить все Score и Users, где Visits.visit_number==1, а затем снова, где Visits.visit_number==2.

data = session.query(Visit.Score, User.id).join(User).filter(Visits.visit_number==1)
data2 = session.query(Visit.Score, User.id).join(User).filter(Visits.visit_number==2)

Проблема в том, что сопоставление двух наборов баллов является серьезной проблемой (так как они не будут в порядке пользователя, и могут быть пользователи, у которых еще не было второго посещения).Я уверен, что есть элегантный способ сделать это в SQLAlchemy, возможно, с псевдонимами.

1 Ответ

1 голос
/ 08 декабря 2011

Следующий код вернет список пар (User.id, Score1-Score2) для пользователей, у которых было (как минимум) 2 посещения:

from sqlalchemy.orm import aliased

Visit1 = aliased(Visit)
Visit2 = aliased(Visit)
session.query(User)\
    .join(Visit1, (Visit1.user_id==User.id) & (Visit1.visit_number==1))\
    .join(Visit2, (Visit2.user_id==User.id) & (Visit2.visit_number==2))\
    .values(User.id, Visit1.Score-Visit2.Score)

Здесь Visit.user_id - столбец, относящийся к User.id.

На самом деле безопасно исключить таблицу для User из цепочки соединений, поскольку таблица Visit уже имеет идентификатор User и вы не запрашиваете другие данные из ее таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...