如何使用Python psycopg2获取与pgAdmin顺序一致的Postgres表列名
问题解决方法
乱序及格式异常的核心原因:
- 直接查询
information_schema.columns时未指定排序规则,Postgres不会默认返回表定义的列顺序 - 你当前获取的
column_name是嵌套元组结构,直接传入DataFrame的columns参数会导致列名格式异常
方法1:修改元数据查询语句(匹配表定义顺序)
查询information_schema.columns时增加ORDER BY ordinal_position,ordinal_position字段就是表创建时的列顺序编号,同时提取列名的字符串值即可:
cur.execute("Select * from actor") tuples = cur.fetchall() # 新增排序规则,查询结果严格匹配表定义的列顺序 cur.execute(""" SELECT column_name FROM information_schema.columns WHERE table_name = 'actor' ORDER BY ordinal_position """) # 把嵌套元组转成字符串列表,解决列名带括号的问题 column_name = [row[0] for row in cur.fetchall()] df = pd.DataFrame(tuples, columns=column_name)
方法2(更推荐):直接从游标获取列名(无需额外查询)
psycopg2的游标执行查询后,自带description属性,返回的列顺序和你SELECT *的结果顺序完全一致,不需要额外查询元数据表,效率更高也不会出现顺序错配问题:
cur.execute("Select * from actor") tuples = cur.fetchall() # 直接从游标属性提取列名,顺序和查询结果100%匹配 column_name = [desc[0] for desc in cur.description] df = pd.DataFrame(tuples, columns=column_name)
内容的提问来源于stack exchange,提问作者martian_rover
相关产品推荐
相关产品推荐

