使用psycopg2.sql插入字典至PostgreSQL表时遇'type dict无法适配'错误
解决PostgreSQL插入jsonb字段时的"can't adapt type 'dict'"错误
问题根源是psycopg2无法自动将Python的字典/列表适配为PostgreSQL的jsonb类型,需要手动做转换处理,以下是两种可行方案:
方案一:单独处理目标字段(适合仅需转换特定字段的场景)
先导入psycopg2.extras中的Json工具,在插入前把months字段用它包装:
from psycopg2.extras import Json import psycopg2 from psycopg2 import sql # 假设已建立数据库连接conn cursor = conn.cursor() for d in data: columns_list = list(d.keys()) insert_query = sql.SQL("INSERT INTO {schema}.{table_name} ({columns}) VALUES ({values})").format( schema=sql.Identifier(schema), table_name=sql.Identifier(table_name), columns=sql.SQL(",").join(map(sql.Identifier, columns_list)), values=sql.SQL(",").join(map(sql.Placeholder, columns_list)) ) # 复制原数据避免修改源数据 insert_data = d.copy() # 对months字段做jsonb适配 if 'months' in insert_data: insert_data['months'] = Json(insert_data['months']) cursor.execute(insert_query, insert_data) # 提交事务 conn.commit() cursor.close() conn.close()
方案二:全局注册jsonb适配器(适合所有jsonb字段自动转换的场景)
如果表中有多个jsonb字段,或者不想逐个处理,在建立数据库连接后注册全局适配器,之后所有Python字典/列表都会自动适配成jsonb类型:
import psycopg2 from psycopg2 import sql from psycopg2.extras import register_default_jsonb # 建立数据库连接 conn = psycopg2.connect( dbname="your_db", user="your_user", password="your_pw", host="your_host" ) # 注册全局jsonb适配器 register_default_jsonb(conn) cursor = conn.cursor() for d in data: columns_list = list(d.keys()) insert_query = sql.SQL("INSERT INTO {schema}.{table_name} ({columns}) VALUES ({values})").format( schema=sql.Identifier(schema), table_name=sql.Identifier(table_name), columns=sql.SQL(",").join(map(sql.Identifier, columns_list)), values=sql.SQL(",").join(map(sql.Placeholder, columns_list)) ) # 直接传入原字典即可,无需手动处理 cursor.execute(insert_query, d) conn.commit() cursor.close() conn.close()
两种方案任选其一即可解决问题,根据你的实际场景选择就行。
内容的提问来源于stack exchange,提问作者Тимур Хабибуллин
相关产品推荐
相关产品推荐

