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

调用PostgreSQL存储过程时遇psycopg2参数超限错误求助

解决psycopg2调用PostgreSQL存储过程时的"超过100个参数"错误

你遇到的这个问题根源在于Python调用存储过程时的参数传递方式错误。你的存储过程明明只需要1个JSON参数,但cur.callproc却把你传入的JSON字符串拆分成了上百个参数——这是因为你直接传了json.dumps(jsonObject)的结果,Python会把字符串当成可迭代对象,将每个字符(或被错误拆分的元素)作为独立参数传入,自然就触发了"cannot pass more than 100 arguments"的限制。

修正方案:将JSON参数包装为单元素元组

只需要把json.dumps生成的字符串放在一个元组里,确保callproc将其作为单个完整参数传递给存储过程即可。修正后的Python代码如下:

try:
    # 建立PostgreSQL连接
    conn = connect(
        dbname="postgres",
        user="postgres",
        host="localhost",
        password="demo",
        port='5432'
    )
    cur = conn.cursor()
    # 关键:把JSON字符串放入元组,明确这是一个参数
    cur.callproc('insert_usr_details_in_all_tables', (json.dumps(jsonObject),))
    # 注:你的存储过程内部已经有COMMIT,若外部需要统一控制事务可调整此处逻辑
except (Exception) as err:
    print("\npsycopg2 connect error:", err)
    # 出错时回滚事务,保证数据一致性
    if conn:
        conn.rollback()
finally:
    # 关闭游标和连接,避免资源泄漏
    if cur:
        cur.close()
    if conn:
        conn.close()

额外建议:用execute替代callproc更直观

如果你觉得callproc的参数传递容易踩坑,可以改用cur.execute直接调用存储过程,语法更接近原生SQL,也更不容易出错:

cur.execute("CALL insert_usr_details_in_all_tables(%s)", (json.dumps(jsonObject),))

为什么脚本执行正常?

你用脚本直接调用存储过程时,是明确将整个JSON字符串作为单个参数传入的(比如CALL insert_usr_details_in_all_tables('{"Name": "...", ...}');),而Python的callproc对单个参数的传递有特殊要求——必须用元组包装,否则就会被误拆分成多个参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:52:37