ORM SQLAlchemy: как построить запрос select / where из списка / dict с сотнями элементов - PullRequest
0 голосов
/ 14 мая 2011

У меня есть две таблицы: «пользователь», который представляет собой список пользователей сайта, и «пост», который представляет собой список всех сообщений пользователей.Любой пользователь следует за разными пользователями, такими как Twitter.Любой объект «пользователь» содержит «следующий» атрибут dict, содержащий список идентификаторов.Любой объект 'post' содержит метку 'user_id', содержащую идентификатор пользователя.

Я хочу получить запрос, который из таблицы 'Post' соберет все сообщения с идентификатором user_id, соответствующим идентификатору, содержащемуся вthe dict.

Но такой запрос, переведенный прямо, приведет к SELECT с сотнями WHERE id = 1 И id = 2 и т. д. подряд.Есть ли лучший способ?

1 Ответ

1 голос
/ 17 мая 2011

Не ясно, как сохраняется ваш атрибут following dict.Если бы он хранился в отдельной таблице N-1 Follows, предполагая, что ваша схема БД выглядит следующим образом:

User(UserID, ...)
Post(PostID, UserID, ...)
Follows(UserID, FollowsUserID, ...)

SQL-запрос для получения нужных данных будет:

SELECT  u.UserID,
        p.*
FROM    User u
JOIN    Follows f
    ON  u.UserID = f.UserID
JOIN    Post p
    ON  f.FollowsUserID = p.UserID

Предполагая, что объекты и отношения настроены, запрос SA для выполнения той же работы будет выглядеть примерно так:

u = ... # get desired User object
qry = (session.query(Post).
        join(User). # User will join to Post properly
        join(Follows, Follows.FollowsUserID == User.UserID). # specify the join condition
        filter(Follows.User == u)
      )
...