我如何从psycopg2游标获取列名称列表?
我想要一个通用的方法来直接从选定的列名生成列标签,并回想一下,看到python的psycopg2模块支持这个function。
从Mark Lutz的“Python编程”
curs.execute("Select * FROM people") colnames = [desc[0] for desc in curs.description]
要在单独的查询中获取列名 ,可以查询information_schema.columns表。
#!/usr/bin/env python3 import psycopg2 if __name__ == '__main__': DSN = 'host=YOUR_DATABASE_HOST port=YOUR_DATABASE_PORT dbname=YOUR_DATABASE_NAME user=YOUR_DATABASE_USER' column_names = [] with psycopg2.connect(DSN) as connection: with connection.cursor() as cursor: cursor.execute("select column_name from information_schema.columns where table_schema = 'YOUR_SCHEMA_NAME' and table_name='YOUR_TABLE_NAME'") column_names = [row[0] for row in cursor] print("Column names: {}\n".format(column_names))
要在与数据行相同的查询中获取列名 ,可以使用游标的描述字段:
#!/usr/bin/env python3 import psycopg2 if __name__ == '__main__': DSN = 'host=YOUR_DATABASE_HOST port=YOUR_DATABASE_PORT dbname=YOUR_DATABASE_NAME user=YOUR_DATABASE_USER' column_names = [] data_rows = [] with psycopg2.connect(DSN) as connection: with connection.cursor() as cursor: cursor.execute("select field1, field2, fieldn from table1") column_names = [desc[0] for desc in cursor.description] for row in cursor: data_rows.append(row) print("Column names: {}\n".format(column_names))
你可以做的另一件事是创build一个游标,你将能够通过他们的名字引用你的列(这是一个需要引导我到这个页面):
import psycopg2 from psycopg2.extras import RealDictCursor ps_conn = psycopg2.connect(...) ps_cursor = psql_conn.cursor(cursor_factory=RealDictCursor) ps_cursor.execute('select 1 as col_a, 2 as col_b') my_record = ps_cursor.fetchone() print (my_record['col_a'],my_record['col_b']) >> 1, 2
我也曾经面对类似的问题。 我用一个简单的技巧来解决这个问题。 假设你在列表中有列名
col_name = ['a', 'b', 'c']
那么你可以做下面的事情
for row in cursor.fetchone(): print zip(col_name, row)
如果你想从数据库查询命名为obj,你可以使用下面的代码片段:
from collections import namedtuple def create_record(obj, fields): ''' given obj from db returns namedtuple with fields mapped to values ''' Record = namedtuple("Record", fields) mappings = dict(zip(fields, obj)) return Record(**mappings) cur.execute("Select * FROM people") colnames = [desc[0] for desc in cur.description] rows = cur.fetchall() cur.close() result = [] for row in rows: result.append(create_record(row, colnames))
这允许您评估logging值,就好像它们是类属性即
record.id,record.other_table_column_name等
甚至更短
from psycopg2.extras import NamedTupleCursor with cursor(cursor_factory=NamedTupleCursor) as cur: cur.execute("Select * ...") return cur.fetchall()
我注意到你必须在查询之后使用cursor.fetchone()
来得到cursor.description
的列表(即在[desc[0] for desc in curs.description]
)
在执行SQL查询之后,写下2.7中编写的python脚本
total_fields = len(cursor.description) fields_names = [i[0] for i in cursor.description Print fields_names
#!/usr/bin/python import psycopg2 #note that we have to import the Psycopg2 extras library! import psycopg2.extras import sys def main(): conn_string = "host='localhost' dbname='my_database' user='postgres' password='secret'" # print the connection string we will use to connect print "Connecting to database\n ->%s" % (conn_string) # get a connection, if a connect cannot be made an exception will be raised here conn = psycopg2.connect(conn_string) # conn.cursor will return a cursor object, you can use this query to perform queries # note that in this example we pass a cursor_factory argument that will # dictionary cursor so COLUMNS will be returned as a dictionary so we # can access columns by their name instead of index. cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) # tell postgres to use more work memory work_mem = 2048 # by passing a tuple as the 2nd argument to the execution function our # %s string variable will get replaced with the order of variables in # the list. In this case there is only 1 variable. # Note that in python you specify a tuple with one item in it by placing # a comma after the first variable and surrounding it in parentheses. cursor.execute('SET work_mem TO %s', (work_mem,)) # Then we get the work memory we just set -> we know we only want the # first ROW so we call fetchone. # then we use bracket access to get the FIRST value. # Note that even though we've returned the columns by name we can still # access columns by numeric index as well - which is really nice. cursor.execute('SHOW work_mem') # Call fetchone - which will fetch the first row returned from the # database. memory = cursor.fetchone() # access the column by numeric index: # even though we enabled columns by name I'm showing you this to # show that you can still access columns by index and iterate over them. print "Value: ", memory[0] # print the entire row print "Row: ", memory if __name__ == "__main__": main()