SQLAlchemy 过滤 None/NULL 值 - 有效 - 但如何将其放入列表中?

Mar*_*her 3 python mysql database sqlalchemy

我想过滤列中NoneMySQL 方言值或其中的数据。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()

但是,不会返回列NULL中具有该值的所有行。为什么不使用该函数的用法?怎么解决这个问题呢?multiplierNonein_

sna*_*erb 8

NULL 比较不等于 NULL,所以

SELECT bar 
  FROM foo
  WHERE bar IN (1, 2, 3 , NULL)
Run Code Online (Sandbox Code Playgroud)

bar将返回is12or 的行,但如果is3则不返回。barNULL

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

SELECT bar 
  FROM foo
  WHERE bar IN (1, 2, 3 , NULL)
Run Code Online (Sandbox Code Playgroud)

或者用 SQLAlchemy 术语来说

SELECT bar FROM foo WHERE bar IN (1, 2, 3) OR bar IS NULL
Run Code Online (Sandbox Code Playgroud)


Jes*_*sse 7

您可以使用列运算符进行比较None(以匹配NULL)。要检查某列是否存在,您可以使用.is_()NULLis_not

如:

result = Foo.filter(
    sa.or_(
        Foo.bar.in_([1,2,3]), 
        Foo.bar.is_(None)
    )
)
Run Code Online (Sandbox Code Playgroud)

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