Mejores formas de imprimir nombres de columnas cuando se usa CX_Oracle
Pregunta
Encontré un ejemplo usando cx_oracle, este ejemplo muestra toda la información de Cursor.description
.
import cx_Oracle
from pprint import pprint
connection = cx_Oracle.Connection("%s/%s@%s" % (dbuser, dbpasswd, oracle_sid))
cursor = cx_Oracle.Cursor(connection)
sql = "SELECT * FROM your_table"
cursor.execute(sql)
data = cursor.fetchall()
print "(name, type_code, display_size, internal_size, precision, scale, null_ok)"
pprint(cursor.description)
pprint(data)
cursor.close()
connection.close()
Lo que quería ver era la lista de Cursor.description[0]
(nombre), así que cambié el código:
import cx_Oracle
import pprint
connection = cx_Oracle.Connection("%s/%s@%s" % (dbuser, dbpasswd, oracle_sid))
cursor = cx_Oracle.Cursor(connection)
sql = "SELECT * FROM your_table"
cursor.execute(sql)
data = cursor.fetchall()
col_names = []
for i in range(0, len(cursor.description)):
col_names.append(cursor.description[i][0])
pp = pprint.PrettyPrinter(width=1024)
pp.pprint(col_names)
pp.pprint(data)
cursor.close()
connection.close()
Creo que habrá mejores formas de imprimir los nombres de las columnas. Por favor, consígueme alternativas al principiante de Python. :-)
Solución
los Código fuente de Sqlalchemy es un buen punto de partida para métodos robustos de introspección de la base de datos. Así es como Sqlalchemy refleja los nombres de las tabla de Oracle:
SELECT table_name FROM all_tables
WHERE nvl(tablespace_name, 'no tablespace') NOT IN ('SYSTEM', 'SYSAUX')
AND OWNER = :owner
AND IOT_NAME IS NULL
Otros consejos
Puede usar la comprensión de la lista como alternativa para obtener los nombres de la columna:
col_names = [row[0] for row in cursor.description]
Dado que Cursor.Description devuelve una lista de tuplas de 7 elementos, puede obtener el elemento 0, que es un nombre de columna.
Aquí el código.
import csv
import sys
import cx_Oracle
db = cx_Oracle.connect('user/pass@host:1521/service_name')
SQL = "select * from dual"
print(SQL)
cursor = db.cursor()
f = open("C:\dual.csv", "w")
writer = csv.writer(f, lineterminator="\n", quoting=csv.QUOTE_NONNUMERIC)
r = cursor.execute(SQL)
#this takes the column names
col_names = [row[0] for row in cursor.description]
writer.writerow(col_names)
for row in cursor:
writer.writerow(row)
f.close()