Me gustaría una forma general de generar etiquetas de columnas directamente desde los nombres de las columnas seleccionadas, y recordar ver que el módulo psycopg2 de python admite esta característica.¿Cómo obtengo una lista de nombres de columnas de un cursor psycopg2?
Respuesta
De "Python Programming" de Mark Lutz:
curs.execute("Select * FROM people")
colnames = [desc[0] for desc in curs.description]
Para obtener los nombres de columna en una consulta independiente, se puede 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))
Para nombres de columna se interponen en la misma consulta como filas de datos, puede 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))
me he dado cuenta de que debe utilizar cursor.fetchone()
después de la consulta a obtener la lista de columnas de cursor.description
(es decir, en [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()
I al tan acostumbrado a enfrentar un problema similar. Utilizo un truco simple para resolver esto. Suponga que tiene los nombres de columna en una lista como
col_name = ['a', 'b', 'c']
continuación, puede hacerlo siguiendo
for row in cursor.fetchone():
print zip(col_name, row)
Después de ejecutar consultas SQL escritura siguiente script en Python escrito en 2,7
total_fields = len(cursor.description)
fields_names = [i[0] for i in cursor.description
Print fields_names
Si desea para tener namedtuple obj de db query puede usar el siguiente fragmento de código:
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))
Esto le allowes para evaluar los 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()
Otra cosa que puedes hacer es crear un cursor con el que puedas hacer referencia a tus columnas por sus nombres (esa es una necesidad que me llevó a esta página en el 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
- 1. ¿Cómo obtengo varias columnas para usar en un bucle de cursor?
- 2. Cómo conservar el orden de las columnas al utilizar psycopg2.extras.RealDictCursor
- 3. ¿Cómo obtengo tablas en postgres usando psycopg2?
- 4. ¿Cómo obtengo un autocompletado de jquery de dos columnas?
- 5. ¿Cómo obtengo una lista de nombres distinta y ordenada de un DataTable utilizando LINQ?
- 6. ¿Cómo obtengo una lista de espacios de nombres en el motor de la aplicación de Google?
- 7. ¿Cómo obtengo una lista de impresoras instaladas?
- 8. Numpy genfromtxt Nombres de columnas
- 9. ¿Cómo obtener una lista de nombres de columna
- 10. ¿Cómo obtengo la lista de todos los nombres de archivo en un directorio usando VB6?
- 11. En Perforce, ¿cómo obtengo una lista de los archivos desprotegidos?
- 12. ¿Cómo devuelves los nombres de las columnas de una tabla?
- 13. ¿Cómo obtengo una NameTable de un XDocument?
- 14. jQuery: ¿cómo obtengo el elemento debajo de mi cursor?
- 15. ¿Cómo obtengo la lista de nombres de proceso en ejecución, en VB.NET?
- 16. Clojure: ¿Cómo obtengo una lista de combinaciones de 'coordenadas'?
- 17. Rellenar una lista de varias columnas
- 18. ¿Cómo obtengo la posición actual del cursor de la pantalla?
- 19. Obtener lista de nombres de columna de una tabla vacía
- 20. Pasando la lista de parámetros a SQL en psycopg2
- 21. ¿Cómo obtengo una lista de índices de elementos distintos de cero en una lista?
- 22. Consultar nombres de columnas de una tabla de otro usuario
- 23. ¿Cómo su búsqueda nombres de las columnas que contienen corchetes?
- 24. ¿Cómo obtengo una lista de directorios en Perl?
- 25. ¿Cómo obtengo una lista de enlaces simbólicos, excluyendo enlaces rotos?
- 26. ¿Cómo obtengo una lista de todos los ensamblajes cargados actualmente?
- 27. Lista de nombres propios?
- 28. mensajes de error psycopg2
- 29. ¿Cómo obtengo una lista de archivos modificados en svn?
- 30. ¿Cómo obtengo una lista de las actualizaciones y revisiones instaladas?
Si solo desea los nombres de las columnas, no seleccione todas las filas en la tabla. Esto es más eficiente: 'curs.execute (" SELECT * FROM personas LIMIT 0 ")' – Demitri
Puede valer la pena agregar que esto funciona tanto para las vistas como para las tablas, mientras que no es (fácilmente) posible obtener nombres de columnas para las vistas de 'information_schema'. – wjv
Podría ser más intuitivo obtener el nombre como atributo: colnames = [desc.name for desc in curs.description] – dexgecko