在psycopg2中使用TRANSLATE()时遭遇KeyError问题求助
KeyError: 'snumber' When Accessing Column With DictCursor in psycopg2
这个问题我之前也碰到过,原因其实很简单——你用TRANSLATE处理后的列没有指定别名,导致DictCursor找不到对应的键名。
问题根源
当你执行SELECT TRANSLATE(snumber, ' ', ''), age FROM sprofile时,PostgreSQL返回的结果集中,第一列的名称并不是snumber,而是整个表达式TRANSLATE(snumber, ' ', '')。虽然psql命令行工具可能会简化显示这个列名,但DictCursor是严格按照结果集返回的列名作为字典键的,所以你用row['snumber']自然会触发KeyError。
而用row[0]能正常工作,是因为DictCursor同时支持按列的索引位置访问,不管列有没有别名,第一个列都可以通过索引0获取。
解决方案
给处理后的列添加一个别名(用AS关键字),让它的键名变回snumber即可:
cur_t = conn_t.cursor(cursor_factory=psycopg2.extras.DictCursor) # 为TRANSLATE处理后的列指定别名AS snumber cur_t.execute(""" SELECT TRANSLATE(snumber, ' ', '') AS snumber, age FROM sprofile """) for row in cur_t: print(row['snumber']) # 现在可以正常访问了
这样修改后,结果集里的第一列就会以snumber作为键名,DictCursor就能正确识别并返回对应的值了。
内容的提问来源于stack exchange,提问作者tango ward
相关产品推荐
相关产品推荐

