¿Cómo obtengo una lista de nombres de columna de un cursor psycopg2?

5 minutos de lectura

avatar de usuario
Setjmp

Me gustaría una forma general de generar etiquetas de columna directamente desde los nombres de columna seleccionados, y recuerdo haber visto que el módulo psycopg2 de python es compatible con esta función.

avatar de usuario
Setjmp

De “Programación Python” por Mark Lutz:

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

  • Si solo desea los nombres de las columnas, no seleccione todas las filas de la tabla. Esto es más eficiente: curs.execute("SELECT * FROM people LIMIT 0")

    – Demitri

    6 sep 2012 a las 22:03


  • Puede valer la pena agregar que esto funciona tanto para vistas como para tablas, mientras que no es (fácilmente) posible obtener nombres de columna para vistas de information_schema.

    – wjv

    23 de junio de 2016 a las 7:30

  • Podría ser más intuitivo obtener el nombre como un atributo: colnames = [desc.name for desc in curs.description]

    – Rovyko

    15 de enero de 2018 a las 23:28

  • Es importante tener en cuenta que los nombres de columna leídos desde la función de descripción del cursor aparecen en minúsculas. curs.execute("Select userId FROM people") colnames = [desc[0] for desc in curs.description] assert colnames == ['userid']

    – dyltini

    13 de noviembre de 2018 a las 11:14


  • curs.description para mí es Ninguno, y no estoy seguro de por qué… Estoy consultando contra Redshift, si eso hace la diferencia.

    – micseydel

    27 de marzo de 2020 a las 22:33


Otra cosa que puede hacer es crear un cursor con el que podrá hacer referencia a sus columnas por sus nombres (esa es una necesidad que me llevó a esta página en primer lugar):

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

  • por favor refiérase a la fuente de la información

    – Pynchia

    26 de agosto de 2020 a las 11:24

  • En mi caso, el “as col_a” era innecesario. Lo omití y los registros devueltos por el cursor usaron los nombres de columna de mi tabla.

    – WGriffing

    20 de noviembre de 2020 a las 15:18

avatar de usuario
alex bitek

A obtener los nombres de las columnas en una consulta separadapuede consultar la tabla 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))

A obtener nombres de columna en la misma consulta que las filas de datospuede utilizar el campo de descripción del cursor:

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

avatar de usuario
zzart

Si desea tener un obj de tupla con nombre de la consulta de base de datos, puede usar el siguiente fragmento:

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))

Esto le permite acceder a valores de registro como si fueran propiedades de clase, es decir

record.id, record.other_table_column_name, etc.

o incluso más corto

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

avatar de usuario
albielín

Si está buscando obtener un marco de datos de pandas con encabezados de columna ya asociadosprueba esto:

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))

  • Esto me parece lo más fácil. Me sorprende que tenga que hacer una consulta por separado para obtener los nombres de las columnas. Trabajó para mi.

    – mandril

    2 oct 2020 a las 14:41

  • Totalmente de acuerdo, @ChuckPedro

    – albielina

    7 de febrero de 2021 a las 7:50

  • método más fácil. esto debería tener más votos a favor

    – Prometeo

    14 abr 2021 a las 14:29

  • Este es el más fácil con diferencia, pero es bastante lento. La forma más rápida de hacer esto es usando pd.DataFrame(np.array(cur.fetchall()))que viene con una secuencia de números como nombres de columna.

    – rodolfo_r

    8 de julio de 2021 a las 19:58

avatar de usuario
francescalus

Después de ejecutar la consulta SQL, escriba el siguiente script de Python escrito en 2.7

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

  • Esto me parece lo más fácil. Me sorprende que tenga que hacer una consulta por separado para obtener los nombres de las columnas. Trabajó para mi.

    – mandril

    2 oct 2020 a las 14:41

  • Totalmente de acuerdo, @ChuckPedro

    – albielina

    7 de febrero de 2021 a las 7:50

  • método más fácil. esto debería tener más votos a favor

    – Prometeo

    14 abr 2021 a las 14:29

  • Este es el más fácil con diferencia, pero es bastante lento. La forma más rápida de hacer esto es usando pd.DataFrame(np.array(cur.fetchall()))que viene con una secuencia de números como nombres de columna.

    – rodolfo_r

    8 de julio de 2021 a las 19:58

avatar de usuario
willem van onsem

He notado que debes usar cursor.fetchone() después de la consulta para obtener la lista de columnas en cursor.description (es decir, en [desc[0] for desc in curs.description])

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad