调用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
相关产品推荐
相关产品推荐

