Я хотел бы получить общий способ создания меток столбцов непосредственно из выбранных имен столбцов и напомню, что видел, что модуль psycopg2 python поддерживает эту функцию.
Как мне получить список имен столбцов с помощью курсора psycopg2?
Ответы (8)
Из книги Марка Лутца «Программирование на Python»:
curs.execute("Select * FROM people LIMIT 0")
colnames = [desc[0] for desc in curs.description]
curs.execute("SELECT * FROM people LIMIT 0")
- person Demitri; 07.09.2012
information_schema
.
- person wjv; 23.06.2016
curs.execute("Select userId FROM people") colnames = [desc[0] for desc in curs.description] assert colnames == ['userid']
- person dyltini; 13.11.2018
curs.description
для меня - Нет, и я не уверен, почему ... Я запрашиваю Redshift, если это имеет значение.
- person micseydel; 28.03.2020
Еще вы можете создать курсор, с помощью которого вы сможете ссылаться на свои столбцы по их именам (это необходимость, которая в первую очередь привела меня к этой странице):
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
Чтобы получить имена столбцов в отдельном запросе, вы можете запросить таблицу 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))
Если вы хотите получить именованный объект кортежа из запроса базы данных, вы можете использовать следующий фрагмент:
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))
Это позволяет вам получить доступ к значениям записей, как если бы они были свойствами класса, т.е.
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()
Если вы хотите получить фрейм данных pandas с уже связанными заголовками столбцов, попробуйте следующее:
import psycopg2, pandas
con=psycopg2.connect(
dbname=DBNAME,
host=HOST,
port=PORT,
user=USER,
password=PASSWORD
)
sql = """
select * from x
"""
d = pandas.read_sql_query(sql,con)
con.close()
print(type(d))
print(pandas.DataFrame.head(d))
pd.DataFrame(np.array(cur.fetchall()))
, который содержит последовательность чисел в качестве имен столбцов.
- person rodolfo_r; 08.07.2021
После выполнения SQL-запроса напишите следующий скрипт Python, написанный в 2.7
total_fields = len(cursor.description)
fields_names = [i[0] for i in cursor.description
Print fields_names
Я заметил, что вы должны использовать cursor.fetchone()
< / a> после запроса, чтобы получить список столбцов в _ 2_ (т. е. в [desc[0] for desc in curs.description]
)
Я тоже сталкивался с подобной проблемой. Я использую простой прием, чтобы решить эту проблему. Предположим, у вас есть имена столбцов в списке вроде
col_name = ['a', 'b', 'c']
Тогда вы можете сделать следующее
for row in cursor.fetchone():
print zip(col_name, row)