使用SQLAlchemy限制联接的ForeignKey查询

2024-09-26 22:54:07 发布

您现在位置:Python中文网/ 问答频道 /正文

当我对我的查询调用limit时,我得到了不准确的结果,我不确定是什么导致了它

型号:

class Voter(db.Model):
    histories = db.relationship('VoterHistory', backref='voter', lazy='dynamic')
    ncid = db.Column(db.String(80),unique=True)


class VoterHistory(db.Model):
    voter_ncid = db.Column(db.String(80), db.ForeignKey('voter.ncid'))
    election_lbl = db.Column(db.String(280))

范例

q1 = Voter.query.filter_by(birth_age='25')

q2  = db.and_(Voter.histories.any(VoterHistory.election_lbl == '11/03/2015'),
      Voter.histories.any(VoterHistory.election_lbl == '03/15/2016'))

res= q1.join(Voter.histories).filter(q2)

如果我在res上调用.count,我会得到大约4000个结果。如果我这样做res.limit(3000).all(),我会得到大约700个结果

这里发生了什么事,我该怎么解决?我正在尝试获取3000Voter个对象


Tags: dbstringmodelcolumnresclasslimitq1
1条回答
网友
1楼 · 发布于 2024-09-26 22:54:07

这里有两件事在起作用,它们一起似乎会产生不一致的结果:

  1. limit应用于SQL查询,实际上限制了查询返回的行数
  2. 查询映射实例时,sqlalchemy将删除重复的实例

在您的例子中,将限制设置为3000确实会将从SQL返回的行数限制为3000行,但是如果在这3000行中Voter类只有700行distinct,那么只会返回700个这样的实例

在您的例子中.join(Voter.histories)看起来是从数据库返回的行数和Voter实例数之间引入了这种非对应关系


我希望这是清楚的。如果没有,我很乐意提供一个例子

相关问题 更多 >

    热门问题