11

嗨,我想从数据库中获取一个表,但包括字段名称,以便我可以从例如 Pandas 中的列标题中使用它们,我不一定事先知道所有字段名称

所以如果我的数据库看起来像

table test1

 a | b | c 
---+---+---
 1 | 2 | 3
 1 | 2 | 3
 1 | 2 | 3
 1 | 2 | 3
 1 | 2 | 3

我该怎么做

import psycopg2 as pq
cn = pq.connect('dbname=mydb user=me')
cr = cn.cursor()
cr.execute('SELECT * FROM test1;')
tmp = cr.fetchall()
tmp

这样 tmp 显示

[('a','b','c'),(1,2,3),(1,2,3),(1,2,3),(1,2,3),(1,2,3)]

谢谢

4

5 回答 5

15

如果您想要的是一个数据框,其中 db 表中的数据作为其值,并且数据框列名称是您从 db 中读取的字段名称,那么这应该可以满足您的要求:

import psycopg2 as pq
cn = pq.connect('dbname=mydb user=me')
cr = cn.cursor()
cr.execute('SELECT * FROM test1;')
tmp = cr.fetchall()

# Extract the column names
col_names = []
for elt in cr.description:
    col_names.append(elt[0])

# Create the dataframe, passing in the list of col_names extracted from the description
df = pd.DataFrame(tmp, columns=col_names)
于 2016-06-28T20:38:14.287 回答
13

列名称可用作cr.description[0][0]cr.description[1][0]等。如果您希望它与您显示的格式完全相同,您需要做一些工作来提取它并将其粘贴在结果集的前面。

于 2013-06-18T03:05:48.777 回答
7

您还可以映射它,看起来更好:

cursor.execute(open("blah.sql", "r").read())
data = cursor.fetchall()
cols = list(map(lambda x: x[0], cursor.description))
df = DataFrame(data, columns=cols)
于 2017-07-12T06:35:35.390 回答
5

您可以使用两个循环案例,不使用熊猫:

temp = []
for x in result:
    temp2 = {}
    c = 0
    for col in cursor.description:
        temp2.update({str(col[0]): x[c]})
        c = c+1
    temp.append(temp2)
print(temp)

这将打印任何这样的:

[{'column1':'foo1','column2':'foo1'},{'column1':'foo2','column2':'foo2'},...]

我希望这对你有帮助!干杯

于 2018-10-01T19:48:40.673 回答
0
import psycopg2 as pq
cn = pq.connect('dbname=mydb user=me')
cr = cn.cursor()
cr.execute('SELECT * FROM test1;')
tmp = cr.fetchall() #Hi, these are your codes that build a connection to a psql server

cols = []
for col in tmp.description:
    cols.append(col[0]) #Collect all column names into an empty list, cols    
tmp.insert(0, tuple(cols)) #insert elements by list.insert(index, new_item) method

输出是

[('a','b','c'),(1,2,3),(1,2,3),(1,2,3),(1,2,3),(1,2,3)]
于 2020-03-09T14:05:33.967 回答