2016-01-03 98 views
0

我正在使用flask-sqlalchemy和sqlite數據庫一起使用。我試圖讓下面的日期1sqlalchemy:paginate不返回預期的元素數

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) 

所有票爲地方的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) 

我確信的是,上述「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) 

它工作正常嗎?但是因爲我不需要這個列,所以知道我上面的例子出了什麼問題仍然很有趣?

回答

1

在我看來,對於4行返回(過濾)的查詢,也有代表VoteList表中的4個不同的行4列,但它們指/鏈接/只屬於2 不同Papers模型。當創建模型實例時,重複項會被過濾掉,因此您的行數會減少。從子查詢添加列時,結果爲(Papers, vote_datetime)的元組,在這種情況下,不會刪除重複項。

+0

是的這就是它...非常感謝 – carl

+0

有沒有辦法來防止刪除重複? – carl

+0

我不確定這會是什麼目的,但我認爲如果你查詢'tuple'而不是'model'實例,它就可以解決問題。因此,不要使用'models.Paper.query ...'(這是(幾乎)'session.query(Paper)'的別名'')'session.query([Paper])...'。但結果不是'Paper'的實例,而是具有'Paper'實例的元組。 – van