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

使用Psycopg2向PostgreSQL表插入嵌套字典时触发KeyError

解决psycopg2插入嵌套字典时的KeyError问题

问题原因

psycopg2的参数占位符%(xxx)s不支持%(country.id)s这种嵌套字典的访问语法,它会直接把country.id当作一个完整的键名去字典里查找,但你的home_manager数据中只有country这个键(对应值是子字典),没有名为country.id的键,因此抛出KeyError: 'country.id'。

解决方案:预处理数据扁平化

把嵌套的country.id提取为平级的键,再传入executemany:

修改后的代码

import psycopg2
import logging
from psycopg2.extras import LoggingConnection

def insert_fixture_data(match: dict):
    conn = psycopg2.connect(
        connection_factory=LoggingConnection, **db_settings)

    home_team = match['home_team']
    home_manager = home_team['managers']

    # 预处理数据,提取嵌套的country.id为平级键
    processed_managers = []
    for manager in home_manager:
        # 复制原字典避免修改原始数据
        processed = manager.copy()
        # 提取country的id,添加为新键country_id
        processed['country_id'] = manager['country']['id']
        processed_managers.append(processed)

    # SQL语句中使用平级的country_id占位符
    sql_updates = (
        "INSERT INTO manager (id,country_id,name,nickname,birth_date) VALUES (%(id)s,%(country_id)s,%(name)s,%(nickname)s,%(dob)s) ON CONFLICT DO NOTHING RETURNING id;"
    )

    try:
        cursor = conn.cursor()
        cursor.executemany(sql_updates, processed_managers)
        conn.commit()  # 提交事务,确保数据写入数据库
    except Exception as error:
        print(error)
        conn.rollback()  # 出错时回滚事务
    finally:
        conn.close()

补充说明

  • 原代码遗漏了conn.commit(),会导致插入操作无法持久化到数据库,必须添加这一步
  • 如果country字段可能为None,需要添加判断避免报错:
    processed['country_id'] = manager['country']['id'] if manager.get('country') else None
    

内容的提问来源于stack exchange,提问作者clattenburg cake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:06:50