flask-sqlalchemy:在一个表中查询记录,在另一个表中没有相关记录(或某个值的记录)

时间:2013-11-11 21:10:13

标签: python sqlalchemy flask flask-sqlalchemy

我正在写一个简单的应用程序,帮助人们打电话给选民。我不希望我的志愿者不止一次地欺骗任何选民。如何获得尚未被召集的选民名单?我正在使用烧瓶 - sqlalchemy烧瓶。

选民模特:

    class Voter(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(80))
        phone = db.Column(db.String(20))
        vanid = db.Column(db.String(20))
        address = db.Column(db.String(255))
        city = db.Column(db.String(255))
        zip_code = db.Column(db.String(20))
        lat  = db.Column(db.Float)
        lng = db.Column(db.Float)
        ...

调用型号:

    class Call(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        voter_id = db.Column(db.Integer, db.ForeignKey('voter.id'))
        voter = db.relationship('Voter', backref=db.backref('calls', lazy='dynamic'))
        user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
        user = db.relationship('User', backref=db.backref('calls', lazy='dynamic'))
        time = db.Column(db.DateTime)
        status_code = db.Column(db.String(20))
        ...

call.status_code将包含诸如completed,busy,wrong_number等值。

我想获得一份有资格被召入的所有选民的名单,以便我可以选择一名为志愿者服务。 (即call.status_code!=已完成等。或者没有相关的通话记录)

如果要在原始SQL中执行此操作,我可能会这样做:

Select [whatever]
FROM Voter v
LEFT JOIN Call c on c.voter_id = v.id
WHERE c.status_code IS NULL OR c.status_code = 'busy'

我无法在sqlalchemy中弄明白。任何见解?

1 个答案:

答案 0 :(得分:4)

你可以使用类似的东西:

required_voters = db.session.query(Voter).outerjoin(Call).filter((Call.voter_id == None) | (Call.status_code != 'completed'))

修改

建议的查询:

vwcc = db.session.query(distinct(Call.voter_id)).filter(Call.status_code == 'completed').subquery()
this will select all unique voters with completed calls

现在是主要部分

required_voters = db.session.query(Voter).outerjoin(Call).outerjoin(vwcc,vwcc.voter_id == Voter.id))。filter((vwcc.voter_id == None)&((Call。 voter_id ==无)|(Call.status_code!='completed')))

我相信这会选出所有选民: - 没有完成状态的通话 和 - 没有电话或者他们的电话没有完成状态 请记住,我是从头脑中写出来的,因此语法可能有点不合适