如何修改SQL语句用Python将JSON字符串列表插入Oracle单列表?
解决方案
问题出在executemany的参数格式上:Oracle的Python驱动要求executemany的第二个参数是参数组的可迭代对象(每个参数组对应一行数据,且元素数量要和SQL中的占位符数量一致)。你当前传入的是字符串列表,每个字符串会被拆解成单个字符序列,导致插入错误。
修改步骤:
调整参数格式:将每个JSON字符串包装为单元素元组(或列表),确保每个参数组匹配SQL中的1个占位符
:1。
可以用列表推导式快速转换:json_params = [(item,) for item in json_object]执行批量插入:
cmd = "INSERT INTO STG_ETL_RBT(PAYLOAD) VALUES (:1)" cursor.executemany(cmd, json_params) # 记得提交事务 connection.commit()
优化写法(生成时直接构造元组):
你也可以在生成JSON字符串的阶段直接构造符合要求的参数格式,省去后续转换步骤:
json_object = [] for i in range(len(df_dictionary)): json_str = json.dumps(df_dictionary[i], indent=4, default=str) json_object.append( (json_str,) ) # 直接存储单元素元组 # 直接执行插入 cmd = "INSERT INTO STG_ETL_RBT(PAYLOAD) VALUES (:1)" cursor.executemany(cmd, json_object) connection.commit()
额外说明:
如果STG_ETL_RBT表的PAYLOAD列是Oracle的JSON类型(而非VARCHAR2),可以修改SQL语句显式转换:
INSERT INTO STG_ETL_RBT(PAYLOAD) VALUES (JSON(:1))
内容的提问来源于stack exchange,提问作者Raghunathan P
相关产品推荐
相关产品推荐

