Tôi muốn một cách tổng quát để tạo nhãn cột trực tiếp từ các tên cột đã chọn và nhớ lại khi thấy mô-đun psycopg2 của python hỗ trợ tính năng này.Làm cách nào để có danh sách tên cột từ con trỏ psycopg2?
Trả lời
Từ "Lập trình Python" Mark Lutz:
curs.execute("Select * FROM people")
colnames = [desc[0] for desc in curs.description]
Để 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.
#!/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))
Để tên get cột trong truy vấn tương tự như dò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))
tôi đã nhận thấy rằng bạn phải sử dụng cursor.fetchone()
sau khi truy vấn để lấy danh sách các cột trong cursor.description
(ví dụ: [desc[0] for desc in curs.description]
)
#!/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()
Tôi al được sử dụ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 vấn đề này. Giả sử bạn có tên cột trong một danh sách như
col_name = ['a', 'b', 'c']
Sau đó, bạn có thể làm sau
for row in cursor.fetchone():
print zip(col_name, row)
Sau khi thực hiện truy vấn SQL ghi sau script python viết bằng 2,7
total_fields = len(cursor.description)
fields_names = [i[0] for i in cursor.description
Print fields_names
Nếu bạn muốn để đặt têntuple obj 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 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))
này allowes bạn để lừa các giá trị kỷ lục, nếu như họ được thuộc tính của lớp tức là
record.id, record.other_table_column_name vv
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()
Một điều bạn có thể làm là tạo ra một con trỏ mà bạn sẽ có thể tham khảo các cột của bạn theo tên của họ (đó là một nhu cầu mà dẫn tôi đến trang này trong nơi đầ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
- 1. Làm cách nào để tạo danh sách từ DataFrame gấu trúc có tên cột và giá trị cột?
- 2. chèn danh tính tsql không có danh sách tên cột
- 3. Trong Python, làm cách nào để xóa mục danh sách thứ N từ danh sách danh sách (xóa cột)?
- 4. Cách chọn cột động từ Danh sách
- 5. Làm cách nào để chỉnh sửa con trỏ tới nút danh sách từ một hàm trong đệ quy?
- 6. Tại sao Linux sử dụng "con trỏ trỏ tới con trỏ" này cho danh sách?
- 7. Làm cách nào để tìm nạp nhiều cột để sử dụng trong vòng lặp con trỏ?
- 8. Cách bảo vệ thứ tự cột trong khi sử dụng psycopg2.extras.RealDictCursor
- 9. Cách lấy giá trị cột từ con trỏ sqlite?
- 10. Làm cách nào để tạo danh sách mới từ danh sách hiện có?
- 11. Cách lấy tên hàm từ con trỏ hàm trong C#?
- 12. Oracle - chọn một cột cụ thể từ con trỏ ref
- 13. Con trỏ tới một mảng con trỏ đến các danh sách được liên kết
- 14. Cách sử dụng tổng hợp với danh sách tên cột
- 15. Làm cách nào để di chuyển con trỏ đến một hàng và cột cụ thể?
- 16. Làm cách nào để tìm vị trí con trỏ (X/Y, không phải dòng/cột) trong văn bản HTML?
- 17. Làm cách nào để có danh sách tên phần tử từ giá trị XML trong SQL Server
- 18. Làm cách nào để buộc con trỏ đến cuối NSTextField?
- 19. Làm thế nào để thay đổi con trỏ từ con trỏ sang ngón tay bằng jQuery?
- 20. Tách danh sách và kiếm tiền từ danh sách con?
- 21. Làm cách nào để có được danh sách các tên riêng biệt, được sắp xếp từ một DataTable bằng LINQ?
- 22. R trích xuất khung dữ liệu từ danh sách không có tiền tố trong tên cột
- 23. Python: danh sách phân vùng tên thành các danh sách con có kích thước bằng nhau
- 24. Làm thế nào để có được tên nhóm làm nổi bật dưới con trỏ trong vim?
- 25. Làm cách nào để sử dụng con trỏ ITypeInfo để lấy tên của loại?
- 26. Làm cách nào để kiểm tra xem con trỏ có trỏ đến NULL không?
- 27. Làm cách nào để sắp xếp một con trỏ tới một con trỏ tới một int?
- 28. Thông báo lỗi trong con trỏ python-mysql: 1054 cột không xác định "x" trong 'danh sách trường'
- 29. Làm cách nào để tìm tên tệp, được cung cấp con trỏ FILE?
- 30. Làm cách nào để xóa một từ khi con trỏ ở giữa từ?
Nếu bạn chỉ muốn tên cột, khô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
Có thể đáng giá thêm rằng nó hoạt động cho các khung nhìn cũng như các bảng, trong khi không dễ dàng lấy tên cột cho các khung nhìn từ 'information_schema'. – wjv
Có thể trực quan hơn để lấy tên làm thuộc tính: tên màu = [desc.name cho desc trong curs.description] – dexgecko