使用psycopg2向Azure Postgres插入数据时遇dict类型适配错误
解决psycopg2插入dict类型到Azure Postgres的错误
错误psycopg2.ProgrammingError: can't adapt type 'dict'的核心原因是:Python字典类型无法被psycopg2自动转换为PostgreSQL支持的原生类型,需要手动处理字典字段的格式转换。
步骤1:确认数据库字段类型
首先检查你的products.product_data表中,对应字典值的字段(比如product_details、seller、availability)是否定义为JSON或JSONB类型——这两种类型是PostgreSQL专门用于存储JSON格式数据的,最适合存放Python字典。
如果字段类型是TEXT,也可以通过序列化字符串的方式存储,但后续查询JSON内容会不方便,建议优先改用JSONB类型。
步骤2:处理字典字段的两种方案
方案一:使用psycopg2内置的JSON适配器
psycopg2提供了Json适配器,可以直接将Python字典转换为PostgreSQL的JSON类型:
from psycopg2.extras import Json # 构建response_data时,将字典字段用Json包装 response_data = { "product_id" : "Test0", "ean": product_data["ean"], "sku": product_data["sku"], "product_title": product_data["product_name"], "category": product_data["category"], "seller": Json(product_data["seller"]), # 包装字典 "current_price": product_data["current_price"], "uvp": product_data["original_price"], "source" : "Google", "availability" : Json(product_data["availability"]), # 包装字典 "discount": product_data["discount"], "product_details": Json(product_data["details"]), # 包装字典 "description": product_data["description"], "avg_stars": float(product_data["avg_stars"]), "recommendation_rate": int(product_data["recommendation_rate"]), "image_url": product_data["image_url"], "url": 'url', "product_url": "product_url" }
之后执行原插入代码即可,psycopg2会自动处理类型转换。
方案二:手动序列化为JSON字符串
如果不想导入额外模块,可以用Python标准库json将字典转为JSON字符串,前提是数据库字段支持(JSON/JSONB/TEXT类型都可):
import json # 构建response_data时,将字典转为JSON字符串 response_data = { "product_id" : "Test0", "ean": product_data["ean"], "sku": product_data["sku"], "product_title": product_data["product_name"], "category": product_data["category"], "seller": json.dumps(product_data["seller"]), # 转为JSON字符串 "current_price": product_data["current_price"], "uvp": product_data["original_price"], "source" : "Google", "availability" : json.dumps(product_data["availability"]), # 转为JSON字符串 "discount": product_data["discount"], "product_details": json.dumps(product_data["details"]), # 转为JSON字符串 "description": product_data["description"], "avg_stars": float(product_data["avg_stars"]), "recommendation_rate": int(product_data["recommendation_rate"]), "image_url": product_data["image_url"], "url": 'url', "product_url": "product_url" }
额外注意事项
- 你的插入SQL中包含
reviews字段,但response_data里并没有这个键,会导致参数缺失错误。需要要么在response_data中补充对应值,要么从SQL的字段列表和VALUES中移除reviews(如果表中该字段允许为空或有默认值)。 - 如果不确定哪些字段是字典,可以先打印类型确认:
print({k: type(v) for k, v in response_data.items()}),针对性处理所有类型为dict的字段。
内容的提问来源于stack exchange,提问作者paul445
相关产品推荐
相关产品推荐

