car*_*arl 5 sql pagination sqlalchemy flask-sqlalchemy
我将flask-sqlalchemy 与sqlite 数据库一起使用。我尝试获得 date1 以下的所有选票
sub_query = models.VoteList.query.filter(models.VoteList.vote_datetime < date1)
sub_query = sub_query.filter(models.VoteList.group_id == selected_group.id)
sub_query = sub_query.filter(models.VoteList.user_id == g.user.id)
sub_query = sub_query.subquery()
old_votes = models.Papers.query.join(sub_query, sub_query.c.arxiv_id == models.Papers.arxiv_id).paginate(1, 4, False)
Run Code Online (Sandbox Code Playgroud)
VoteList 的数据库模型如下所示
class VoteList(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
group_id = db.Column(db.Integer, db.ForeignKey('groups.id'))
arxiv_id = db.Column(db.String(1000), db.ForeignKey('papers.arxiv_id'))
vote_datetime = db.Column(db.DateTime)
group = db.relationship("Groups", backref=db.backref('vote_list', lazy='dynamic'))
user = db.relationship("User", backref=db.backref('votes', lazy='dynamic'), foreign_keys=[user_id])
def __repr__(self):
return '<VoteList %r>' % (self.id)
Run Code Online (Sandbox Code Playgroud)
我确保上面的“old_votes”选择有 20 个元素。如果我使用 .all() 而不是 .paginate() 我会得到预期的 20 结果?由于我在上面的示例中使用了最大结果值 4,因此我预计 old_votes.items 有 4 个元素。但它只有2个?如果我增加最大结果值,元素数量也会增加,但它总是低于最大结果值?分页似乎在这里弄乱了一些东西?有任何想法吗?谢谢卡尔
编辑我注意到,如果我在 add_columns() 上应用 paginate() 函数,它就可以正常工作。因此,如果我添加(没有充分理由)一列
old_votes = models.Papers.query.join(sub_query, sub_query.c.arxiv_id == models.Papers.arxiv_id)
old_votes = old_votes.add_columns(sub_query.c.vote_datetime).paginate(page, VOTES_PER_PAGE, False)
Run Code Online (Sandbox Code Playgroud)
效果好吗?但由于我不需要该专栏,因此了解上面的示例出了什么问题仍然很有趣?
在我看来,对于查询返回(和过滤)的 4 行,有 4 行代表表的 4 个不同行VoteList
,但它们引用/链接/只属于 2 个不同的 Papers
模型。创建模型实例时,重复项将被过滤掉,因此您获得的行数会减少。当您从子查询添加列时,结果是 的元组(Papers, vote_datetime)
,在这种情况下不会删除任何重复项。
归档时间: |
|
查看次数: |
2897 次 |
最近记录: |