2016-02-13 68 views
1

我在sqlalchemy中遇到以下奇怪的行爲。SQL鍊金術。查詢中的tuple_ func和None值

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: []}] 

好像在山坳birth_date爲空失敗使用tuple_

回答

2

這並不工作,因爲在SQL中比較NULLIS 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))))