You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

psycopg2语法错误:如何将列表中None值转为SQL兼容的Null?

问题描述

我创建了一个包含数值的列表,尝试通过以下Python代码从SQL数据库中检索数据:

list_upi= upi.tolist()
json_string=json.dumps(list_upi)
crr = sstn.query_db('aurora', f"""select "Carbon" from api.match_sec_str_array('{list_upi}')"""
execute()

列表示例如下:

0        1035711463.0
1        1007978477.0
2        1250122485.0
3        1008200741.0
4        2000828698.0

但当列表中存在None值时,触发psycopg2语法错误:

syntax error at or near "None"
LINE 1: ...879.0, 1008759844.0, 1008144844.0, 1008156925.0, 'None', 100...

已确认列表全为数据库中存在的数据时可正常查询,现咨询如何将None值转为Null或其他值,避免代码因数据不存在而终止执行。

解决方案

方法1:预处理列表替换None为SQL NULL

手动处理列表,将None转换为SQL兼容的NULL,再拼接成PostgreSQL数组格式:

# 转换列表,None替换为'NULL',数值转为字符串保留格式
processed_list = [str(item) if item is not None else 'NULL' for item in upi.tolist()]
# 拼接成ARRAY语法格式
array_input = f"ARRAY[{','.join(processed_list)}]"
# 执行查询
crr = sstn.query_db('aurora', f"""select "Carbon" from api.match_sec_str_array({array_input})""")
crr.execute()

方法2:参数化查询(推荐)

利用psycopg2的参数化特性,直接传递Python列表,它会自动将None映射为SQL NULL,同时避免SQL注入风险:

list_upi = upi.tolist()
# 使用%s作为参数占位符
crr = sstn.query_db('aurora', """select "Carbon" from api.match_sec_str_array(%s)""")
# 传递参数时用元组包裹
crr.execute((list_upi,))

这是最安全可靠的方案,无需手动处理字符串拼接。

方法3:自定义JSON序列化处理None

如果必须依赖JSON格式传递,自定义JSON编码器将None序列化为null(符合SQL JSON规范),再在SQL中做类型转换:

import json

class NullEncoder(json.JSONEncoder):
    def default(self, obj):
        if obj is None:
            return None
        return super().default(obj)

list_upi = upi.tolist()
json_string = json.dumps(list_upi, cls=NullEncoder)
# 将JSON字符串转为PostgreSQL数组类型
crr = sstn.query_db('aurora', f"""select "Carbon" from api.match_sec_str_array('{json_string}'::json)""")
crr.execute()

注意:此方法要求match_sec_str_array函数支持JSON数组输入,或需额外做类型转换。

内容的提问来源于stack exchange,提问作者user20004947

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:10:57