如何在 psycopg 中使用 SELECT 查询查找空值?

How can I find null values with SELECT query in psycopg?

我在 python 中使用 psycopg2 库,当我用 None 插入空值时,INSERT 查询工作正常,但是当我想做 SELECT null 时值,None 没有 return。

cur.execute("SELECT id FROM registro WHERE id_movil = (%s);", (None,))

这个查询没有return任何行,我不知道错误在哪里。

有人知道如何进行 SELECT 查询以在数据库中查找空值吗?

首先要做的是找出它将您的命令转换成什么查询:

print(cur.mogrify("SELECT id FROM registro WHERE id_movil = (%s);", (None,)))

如果这给你的不是 IS NULL 编码检查,它不会从 table.

中得到 NULL。

具体来说,如果您看到短语 = NULL,您就会知道它没有被正确翻译(1),您必须执行如下操作:

if var is None:
    cur.execute("SELECT id FROM registro WHERE id_movil IS NULL;")
else:
    cur.execute("SELECT id FROM registro WHERE id_movil = (%s);", (var,))

或者,如果您知道自己一直在寻找 NULL 值(正如您对常量 None 的使用似乎表明的那样),只需使用:

cur.execute("SELECT id FROM registro WHERE id_movil IS NULL;")

(1) 当参数为 None 时,很可能只有 %s 被替换为 NULL,并且它是不够聪明,无法返回并将 = 更改为 IS(或将 <> 更改为 IS NOT)。

这可以解释为什么会这样:

cur.execute("INSERT into mytbl value (%s);", (None,))

(因为 替换 %s 给出了您想要的命令),但是带有 = NULL 的任何内容都不会按预期运行,除非您已经被它烧毁了足够多的时间 知道 会发生什么:-)。

检查某物是否为 NULL 值的语法不同:

cur.execute("SELECT id FROM registro WHERE id_movil IS NULL;")

这同样适用于获取所有不是 NULL:

的东西
cur.execute("SELECT id FROM registro WHERE id_movil IS NOT NULL;")

编辑:

您可以像往常一样使用 AND 组合 WHERE 子句:

cur.execute(
    "SELECT id FROM registro WHERE id_movil IS NULL AND name = (%s);",
    ('Bob',)
)

试试这个

cur.execute("SELECT id FROM registro WHERE (id_movil = (%s) or id_movil is null);", (movil,))

我目前正在试验的替代方案是名为 transform_null_equals (https://www.postgresql.org/docs/13/runtime-config-compatible.html#GUC-TRANSFORM-NULL-EQUALS)

的 postgres 设置

您可以在 postgresql.conf 中设置它,或者您进行配置(我正在使用 docker-compose 用于本地开发和 RDS 用于生产,所以这意味着参数组)。

transform_null_equals = 1

结果是 postgres 然后神奇地将任何 = NULL 查询转换为 IS NULL,您无需考虑!