2011-05-13 15 views
8

Estoy usando el módulo sqlite3 de Python y me gustaría obtener una lista de todas las columnas en una tabla cuando la tabla no tiene ninguna fila.Obtener lista de nombres de columna de una tabla vacía

Normalmente, si se crea una base de datos como

import sqlite3 

conn = sqlite3.connect(":memory:") 
c = conn.cursor() 

# create the table schema 
c.execute('''create table stocks 
(date text, trans text, symbol text, 
    qty real, price real)''') 

conn.commit() 
c.close() 

Entonces puedo obtener los nombres de columna con algo así como

conn.row_factory = sqlite3.Row 
c = conn.cursor() 
c.execute('select * from stocks') 
r = c.fetchone() 
print r.keys() 

El problema es, si la tabla está vacía inicialmente, c.fetchone() vuelve None . Si hay filas comprometidas, entonces puedo obtener una lista de los nombres de las columnas.

¿Hay alguna otra manera de hacerlo? Pasé por el sqlite3 oficial, pero no pude encontrar nada útil en ese sentido.

Supongo que podría poner algunos datos ficticios en la tabla, luego recuperar los nombres de las columnas y luego eliminar la fila, pero esperaba que hubiera una forma más elegante de hacerlo.

Editar:

parece que hay algunas maneras de hacerlo:

  1. Obtener el SQL que se utilizó para crear la tabla:

    c.execute("""SELECT sql FROM sqlite_master 
    WHERE tbl_name = 'stocks' AND type = 'table'""") 
    
  2. uso del PRAGMA instrucción de sqlite3:

    c.execute("PRAGMA table_info(stocks)") 
    
  3. utilizar el campo de la .descriptionCursor objeto

    c.execute('select * from stocks') 
    r=c.fetchone() 
    print c.description 
    

De éstos, No.2 parece el más simple y más directo. Gracias por toda la ayuda.

Respuesta

5

tratan con:

conn.row_factory = sqlite3.Row 
c = conn.cursor() 
c.execute('select * from stocks') 
r = c.fetchone() 
print c.description   # This will print the columns names 

>>> (('date', None, None, None, None, None, None), ('trans', None, None, None, None, None, None), ('symbol', None, None, None, None, None, None), ('qty', None, None, None, None, None, None), ('price', None, None, None, None, None, None)) 

Como se explica here, sólo los primeros elementos de cada 7-tupla es ventajosa.

+2

'seleccionar ... límite 1', ¿no? – dan3

3
import sqlite3 
con=sqlite3.connect(":memory:") 
c=con.cursor() 
c.execute("select * from stocks") 
fieldnames=[f[0] for f in c.description] 
Cuestiones relacionadas