这是我的(PostgreSQL)表——
test=> create table people (name varchar primary key,
marriage_status varchar) ;
test=> insert into people values ('Ken', 'married');
test=> insert into people values ('May', 'single');
test=> insert into people values ('Joe', NULL);
我想选择所有 不 知道已婚的人,即包括婚姻状态为 NULL 的人。
这 不起作用——
test=> select * from people where marriage_status != 'married' ;
name | marriage_status
------+-----------------
May | single
(1 row)
当然可以——
test=> select * from people where marriage_status != 'married'
or marriage_status is NULL ;
name | marriage_status
------+-----------------
May | single
Joe |
问题是我正在从 SQLAlchemy 访问它——
...filter(or_(people.marriage_status!='married',
people.marriage_status is None))
它被翻译成——
SELECT people.name as name,
people.marriage_status as marriage_status
FROM people
WHERE people.marriage_status != %(status_1)s OR False
sqlalchemy.engine.base.Engine.... {'status_1': 'married'}
并且 不起作用——
test=> select * from people where marriage_status != 'married'
or False;
name | marriage_status
------+-----------------
May | single
(1 row)
也没有——
test=> select * from people where marriage_status != 'married'
or NULL;
name | marriage_status
------+-----------------
May | single
(1 row)
我应该如何通过 SQLAlchemy 选择 NULL 值?
原文由 Jerry 发布,翻译遵循 CC BY-SA 4.0 许可协议
对于 SQLAlchemy 0.7.9 及更高版本 请使用 来自@jsnow 的答案。 !!!
对于 SQLAlchemy 0.7.8 及更早版本
(如 @augurar 所示):由于 sqlalchemy 使用 魔术方法(运算符重载) 来创建
SQL
构造,它只能处理诸如!=
或==
类的运算符,但不能使用is
(这是一个非常有效的 Python 构造)。因此,要使其与 sqlalchemy 一起使用,您应该使用:
,基本上将
is None
替换为 ---== None
。在这种情况下,您的查询将正确转换为以下 SQL:请参阅 文档 中的
IS NULL
。