我在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的行失败了
答案 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()