Làm cách nào để có được danh sách tên cột từ con trỏ psycopg2?


137

Tôi muốn một cách chung để tạo nhãn cột trực tiếp từ các tên cột đã chọn và nhớ lại thấy mô-đun psycopg2 của python hỗ trợ tính năng này.

Câu trả lời:


224

Từ "Lập trình Python" của Mark Lutz:

curs.execute("Select * FROM people LIMIT 0")
colnames = [desc[0] for desc in curs.description]

64
Nếu bạn chỉ muốn tên cột, đừng chọn tất cả các hàng trong bảng. Điều này hiệu quả hơn:curs.execute("SELECT * FROM people LIMIT 0")
Demitri

2
Có thể đáng để thêm rằng điều này hoạt động cho các khung nhìn cũng như các bảng, trong khi không thể (dễ dàng) có thể lấy tên cột cho các lượt xem từ đó information_schema.
wjv

5
Có thể trực quan hơn để lấy tên làm thuộc tính: colnames = [desc.name cho desc trong curs.description]
rovyko

Điều quan trọng cần lưu ý là tên cột được đọc từ chức năng mô tả con trỏ đi ra bằng chữ thường. curs.execute("Select userId FROM people") colnames = [desc[0] for desc in curs.description] assert colnames == ['userid']
dyltini

Bạn nên cập nhật câu trả lời của mình với đề xuất GIỚI HẠN 0. Nếu không, bạn sẽ lấy toàn bộ bảng chỉ để kiểm tra tên.
Carlos Pinzón

41

Một điều khác bạn có thể làm là tạo một con trỏ mà bạn sẽ có thể tham chiếu các cột của mình theo tên của chúng (đó là nhu cầu dẫn tôi đến trang này ở vị trí đầu tiên):

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

26

Để có được các tên cột trong một truy vấn riêng biệt , bạn có thể truy vấn bảng 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))

Để nhận tên cột trong cùng truy vấn với các hàng dữ liệu , bạn có thể sử dụng trường mô tả của con trỏ:

#!/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))

16

Nếu bạn muốn có một tuple obj có tên từ truy vấn db, bạn có thể sử dụng đoạn mã sau:

from collections import namedtuple

def create_record(obj, fields):
    ''' given obj from db returns named tuple 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))

Điều này cho phép bạn truy cập các giá trị bản ghi như thể chúng là các thuộc tính lớp

record.id, record.other_table_column_name, v.v.

hoặc thậm chí ngắn hơn

from psycopg2.extras import NamedTupleCursor
with cursor(cursor_factory=NamedTupleCursor) as cur:
   cur.execute("Select * ...")
   return cur.fetchall()

4

Sau khi thực hiện truy vấn SQL, hãy viết đoạn mã python được viết trong 2.7

total_fields = len(cursor.description)    
fields_names = [i[0] for i in cursor.description   
    Print fields_names


0

Tôi cũng đã từng đối mặt với vấn đề tương tự. Tôi sử dụng một mẹo đơn giản để giải quyết điều này. Giả sử bạn có tên cột trong danh sách như

col_name = ['a', 'b', 'c']

Sau đó, bạn có thể làm như sau

for row in cursor.fetchone():
    print zip(col_name, row)

0
 # You can use this function
 def getColumns(cursorDescription):
     columnList = []
     for tupla in cursorDescription:
         columnList.append(tupla[0])
     return columnList 

-7
#!/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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.