SQL Alchemy。查询中的tuple_ func和无值

时间:2016-02-13 01:53:43

标签: python postgresql sqlalchemy

我在sqlalchemy中有以下奇怪的行为。

Session.query(Player).filter(Player.name == 'Elijah Millsap').filter(Player.birth_date == None).first()
{name: Elijah Millsap, team: []}
Session.query(Player).filter(tuple_(Player.name, Player.birth_date).in_([('Elijah Millsap', None)])).all()
[]
Session.query(Player).filter(tuple_(Player.name, Player.birth_date).in_([('Elijah Millsap', None), ('Chris Bosh', '1984-03-24')])).all()
[{name: Chris Bosh, team: []}]

使用元组_查询时,似乎col birth_date为null的行失败了

2 个答案:

答案 0 :(得分:2)

这不起作用,因为与SQL中的NULL的比较是IS NULL。比较= NULL生成NULL而不是布尔值true或false。

在SQLAlchemy中,比较== None已转换为IS NULL,但当您使用in_时,NULL会直接放入值列表中,从而导致RDBMS将其评估为= NULL,而不是IS NULL

不幸的是,在这种情况下,解决方案并不理想。您必须在其中添加None s并取出or_的元组。例如:

.filter(or_(tuple_(Player.name, Player.birth_date).in_([('Chris Bosh', '1984-03-24')]),
            and_(Player.name.in_(['Elijah Millsap']), Player.birth_date.is_(None))))

答案 1 :(得分:0)

尝试这样:

    tup =[('Elijah Millsap', None), ('Chris Bosh', '1984-03-24')]
    tup_join = ['|'.join(filter(None,t)) for t in tup]  

    Session.query(Player).filter(func.concat_ws('|',Player.name, Player.birth_date).in_(tup_join)).all()