sqlalchemy IS NOT NULL选择

sal*_*mey 76 python sqlalchemy

如何在SQL中添加过滤器以从特定列中选择NOT NULL值?

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

如何使用SQLAlchemy过滤器执行相同的操作?

select = select(table).select_from(table).where(all_filters) 
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 116

column_obj != None会产生IS NOT NULL约束:

在列上下文中,生成子句a != b.如果目标是None,产生一个IS NOT NULL.

或使用isnot()(0.7.9中的新内容):

实施IS NOT运营商.

通常情况下,IS NOT比较的值时,自动生成的None,其解析为NULL.但是,IS NOT如果与某些平台上的布尔值进行比较,则可能需要明确使用.

演示:

>>> from sqlalchemy.sql import column
>>> column('YourColumn') != None
<sqlalchemy.sql.elements.BinaryExpression object at 0x10c8d8b90>
>>> str(column('YourColumn') != None)
'"YourColumn" IS NOT NULL'
>>> column('YourColumn').isnot(None)
<sqlalchemy.sql.elements.BinaryExpression object at 0x104603850>
>>> str(column('YourColumn').isnot(None))
'"YourColumn" IS NOT NULL'
Run Code Online (Sandbox Code Playgroud)

  • @Breezer:不,因为`is`不能像`!=`那样被自定义类重载. (17认同)
  • "不是无"产生相同的输出吗? (6认同)
  • 另一个答案是现在的首选答案。它还避免了包括PyCharm在内的许多IDE生成警告。 (2认同)

Fil*_*ola 77

从版本0.7.9开始,您可以使用过滤器运算符.isnot而不是比较约束,如下所示:

query.filter(User.name.isnot(None))

只有在关注pep8时才需要此方法.

来源:sqlalchemy文档

  • 除了制作PEP8高兴,我认为这是一个更好的解决办法,因为`NULL`不是有效的作为`!=`在SQL和使用`isnot`更好地传达你的意图,你想要的东西生成的语句看起来像RHS. (4认同)
  • @Josh:SQLAlchemy 不会发出 `!= NULL`,即使你在 Python 端使用 `column != None`;你得到`IS NOT NULL`。使用 `.isnot()` 可以让你 *force* `IS NOT` 用于其他类型(例如,考虑针对布尔列的 `.isnot(True)`)。 (2认同)

Mat*_*sen 28

如果其他人想知道,你可以is_用来生成foo IS NULL:

>>> from sqlalchemy.sql import column
>>> print column('foo').is_(None)
foo IS NULL
>>> print column('foo').isnot(None)
foo IS NOT NULL

  • 谢谢,这就是我一直在寻找的东西,但谷歌把我送到了这里! (5认同)