Psycopg3查询NULL值报错:从Psycopg2迁移后的语法问题
Psycopg3中处理NULL查询参数的解决方案
在Psycopg3中,PostgreSQL的SQL语法要求更严格——IS NULL是固定语法,不能用参数占位符($1)替代NULL关键字,这就是你遇到语法错误的原因。Psycopg2之前可能做了隐式的语法转换,但Psycopg3不再支持这种非标准用法。
下面是几种可行的解决办法:
方法1:明确判断NULL(固定场景)
如果你的查询逻辑就是要匹配var_1为NULL的情况,直接写死IS NULL即可:
cursor.execute("SELECT * FROM mock_table WHERE var_1 IS NULL")
方法2:使用IS NOT DISTINCT FROM(通用场景)
如果参数可能是具体值或NULL,推荐用IS NOT DISTINCT FROM,它能同时处理普通值和NULL的匹配:
# 参数为None时,等价于var_1 IS NULL;参数为具体值时,等价于var_1 = 值 cursor.execute("SELECT * FROM mock_table WHERE var_1 IS NOT DISTINCT FROM %s", [None])
方法3:动态构建查询语句(灵活场景)
根据参数是否为NULL动态拼接SQL,确保语法正确:
param = None if param is None: cursor.execute("SELECT * FROM mock_table WHERE var_1 IS NULL") else: cursor.execute("SELECT * FROM mock_table WHERE var_1 = %s", [param])
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

