如何在 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
,您无需考虑!
我在 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
,您就会知道它没有被正确翻译(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)
您可以在 postgresql.conf
中设置它,或者您进行配置(我正在使用 docker-compose 用于本地开发和 RDS 用于生产,所以这意味着参数组)。
transform_null_equals = 1
结果是 postgres 然后神奇地将任何 = NULL
查询转换为 IS NULL
,您无需考虑!