None/NULL 值的 SQLAlchemy 过滤器 - 工作 - 但如何将它放在列表中?

SQLAlchemy filter for None/NULL Value - WORKS - but how to have it in_ a list?

我想针对 None 或 MySQL 方言 NULL 列中的值过滤我的数据。

这很容易完成:

db.query(models.Data).filter(models.Data.multiplier == None).all()

好吧,但我正在构建一种高级筛选和排序功能。因此,我有一个包含要过滤的值的列表,例如:

[1,2,5]

为此过滤我的数据也很容易:

db.query(models.Data).filter(models.Data.multiplier.in_([1,2,5])).all()

但现在我还想在我的列表中允许 None 值:

[1,2,5,None]

过滤:

db.query(models.Data).filter(models.Data.multiplier.in_([1,2,5,None])).all()

但是,multiplier 列中具有 NULL 值的所有行都 NOT 返回。为什么 None 不能与 in_ 函数一起使用?如何解决?

NULLdoesn't compare as equal to NULL,所以

SELECT bar 
  FROM foo
  WHERE bar IN (1, 2, 3 , NULL)

将 return 行,其中 bar123 但如果 barNULL .

相反,您需要提供 NULL 案例作为 IN 案例的替代方案。

SELECT bar FROM foo WHERE bar IN (1, 2, 3) OR bar IS NULL

或者用 SQLAlchemy 术语来说

import sqlalchemy as sa

...

result = (session.query(Foo)
                 .filter(
                     sa.or_(
                         Foo.bar.in_([1, 2, 3]),
                         Foo.bar == None
                     )
                 )
)

您可以使用 is_() column operator 使用 None 进行比较(以匹配 NULL)。要检查列是否不是 NULL,您可以使用 is_not.

如:

result = Foo.filter(
    sa.or_(
        Foo.bar.in_([1,2,3]), 
        Foo.bar.is_(None)
    )
)

但是,是的,当您使用 in_ 进行过滤时,请听 snakecharmerb。