ORM SQLAlchemy:如何使用数百个元素从list / dict构建select / where查询

时间:2011-05-14 12:32:30

标签: orm select dictionary sqlalchemy

我有两个表:“user”是网站用户列表,“post”是所有用户帖子的列表。 任何用户都关注不同的用户,例如Twitter。 任何“用户”对象都包含一个包含id列表的“跟随”dict属性。 任何“post”对象都包含一个包含id用户的“user_id”标签。

我想从“发布”表中获取一个查询,收集所有与'user_id'相匹配的帖子,其中包含dict中包含的id。

但直接翻译的这样一个查询会导致SELECT中连续有数百个WHERE id = 1 AND id = 2等。还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

目前尚不清楚您的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)
      )