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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:30:10