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

时间:2015-09-09 07:20:55

标签: python null psycopg2

我在python中使用psycopg2库,当我使用None插入null值时INSERT查询工作正常,但是当我想要SELECT空值时,使用None并不返回任何

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

此查询不返回任何行,我不知道错误在哪里。

任何人都知道如何让SELECT查询在数据库中找到空值?

4 个答案:

答案 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时,只有NULLNone替换,而且&#&# 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)

的 postgres 设置

您可以在 postgresql.conf 中进行设置,或者您可以按照自己的方式进行配置(我将 docker-compose 用于本地开发,将 RDS 用于生产,因此这意味着参数组)。

transform_null_equals = 1

效果是 postgres 只是神奇地将任何 = NULL 查询转换为 IS NULL,而您无需考虑它! ?