我在python中使用psycopg2库,当我使用None插入null值时INSERT
查询工作正常,但是当我想要SELECT
空值时,使用None并不返回任何
cur.execute("SELECT id FROM registro WHERE id_movil = (%s);", (None,))
此查询不返回任何行,我不知道错误在哪里。
任何人都知道如何让SELECT
查询在数据库中找到空值?
答案 0 :(得分:3)
首先要做的是找出它将你的命令变成什么样的查询:
print(cur.mogrify("SELECT id FROM registro WHERE id_movil = (%s);", (None,)))
如果除了IS NULL
编码检查之外的任何其他内容,它就不会从表中获取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)当参数为%s
时,只有NULL
被None
替换,而且&#&# 39;不够聪明,无法返回并将=
更改为IS
(或<>
更改为IS NOT
)。
这可以解释为什么会这样:
cur.execute("INSERT into mytbl value (%s);", (None,))
(因为只替换 %s
会给出你想要的命令),但= NULL
的任何内容都不会按预期运行,除非你被烧掉了足够多次知道期待什么: - )。
答案 1 :(得分:1)
试试这个
public class ApiKeyRequiredAttribute : AuthorizationFilterAttribute
{
private string key;
public ApiKeyRequiredAttribute(string key)
: base()
{
this.key = key;
}
public override Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
IEnumerable<string> headers = new List<string>();
actionContext.Request.Headers.TryGetValues("x-apikey", out headers);
if (!headers.Any() || headers.Single() != this.key)
{
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized,
new SecurityException("Invalid API key Provided"));
}
return base.OnAuthorizationAsync(actionContext, cancellationToken);
}
}
答案 2 :(得分:0)
有一种不同的语法可以检查某些内容是否为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',)
)
答案 3 :(得分:0)
我目前正在试验的另一种方法是名为 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
,而您无需考虑它! ?