使用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
相关产品推荐
相关产品推荐

