python - tutorial - ¿Hay alguna forma de obtener una lista de nombres de columna en sqlite?
tutorial django (8)
Quiero obtener una lista de nombres de columna de una tabla en una base de datos. Usando pragma, obtengo una lista de tuplas con mucha información innecesaria. ¿Hay alguna forma de obtener solo los nombres de las columnas? Entonces podría terminar con algo como esto:
[Columna1, Columna2, Columna3, Columna4]
La razón por la que realmente necesito esta lista es porque quiero buscar un nombre de columna en la lista y obtener el índice porque el índice se usa en gran parte de mi código.
¿Hay alguna forma de obtener una lista como esta?
Gracias
Hasta donde puedo decir, Sqlite no es compatible con INFORMATION_SCHEMA. En cambio, tiene sqlite_master.
No creo que puedas obtener la lista que quieres con solo un comando. Puede obtener la información que necesita utilizando sql o pragma, luego use expresiones regulares para dividirla en el formato que necesita
SELECT sql FROM sqlite_master WHERE name=''tablename'';
te da algo como
CREATE TABLE tablename(
col1 INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
col2 NVARCHAR(100) NOT NULL,
col3 NVARCHAR(100) NOT NULL,
)
O usando pragma
PRAGMA table_info(tablename);
te da algo como
0|col1|INTEGER|1||1
1|col2|NVARCHAR(100)|1||0
2|col3|NVARCHAR(100)|1||0
Me gusta la respuesta de @thebeancounter, pero prefiero parametrizar las incógnitas, siendo el único problema una vulnerabilidad a los exploits en el nombre de la tabla. Si estás seguro de que está bien, entonces esto funciona:
def get_col_names(cursor, tablename):
"""Get column names of a table, given its name and a cursor
(or connection) to the database.
"""
reader=cursor.execute("SELECT * FROM {}".format(tablename))
return [x[0] for x in reader.description]
Si es un problema, puede agregar código para desinfectar el nombre de tabla.
No soy un usuario de sqlite, así que tómenlo con un grano de sal; la mayoría de los RDBM admiten el estándar ANSI de las vistas INFORMATION_SCHEMA. Si ejecuta la siguiente consulta:
SELECT *
FROM INFORMATION_SCHEMA.columns
WHERE table_name = ''your table''
Debería obtener una tabla que enumere todas las columnas en su tabla especificada. Puede tomar algunos ajustes para obtener el resultado que desea, pero es un comienzo.
Puedes usar sqlite3 y pep-249
import sqlite3
connection = sqlite3.connect(''~/foo.sqlite'')
cursor = connection.execute(''select * from bar'')
cursor.description es una descripción de las columnas
names = list(map(lambda x: x[0], cursor.description))
Alternativamente, puede usar una lista de comprensión:
names = [description[0] for description in cursor.description]
Suponiendo que conoces el nombre de la tabla, y quieres los nombres de las columnas de datos, puedes usar el código listado para hacerlo de una manera simple y elegante a mi gusto:
import sqlite3
def get_col_names():
#this works beautifully given that you know the table name
conn = sqlite3.connect("t.db")
c = conn.cursor()
c.execute("select * from tablename")
return [member[0] for member in c.description]
Una alternativa a la solución cursor.description de podría ser el uso de row.keys () :
import sqlite3
connection = sqlite3.connect(''~/foo.sqlite'')
connection.row_factory = sqlite3.Row
cursor = connection.execute(''select * from bar'')
# instead of cursor.description:
row = cursor.fetchone()
names = row.keys()
El inconveniente: solo funciona si hay al menos una fila devuelta por la consulta.
El beneficio: puede acceder a las columnas por su nombre (fila [''your_column_name''])
Lea más sobre los objetos Row en la documentación de python .
Yo uso esto:
import sqlite3
db = sqlite3.connect(''~/foo.sqlite'')
dbc = db.cursor()
dbc.execute("PRAGMA table_info(''bar'')"
ciao = dbc.fetchall()
HeaderList=[]
for i in ciao:
counter=0
for a in i:
counter+=1
if( counter==2):
HeaderList.append(a)
print(HeaderList)
Manera rápida e interactiva de ver los nombres de las columnas
Si trabajas interactivamente en Python y solo quieres ''ver'' rápidamente los nombres de las columnas, encontré que cursor.description funcionaba.
import sqlite3
conn = sqlite3.connect(''test-db.db'')
cursor = conn.execute(''select * from mytable'')
cursor.description
Produce algo como esto:
((''Date'', None, None, None, None, None, None),
(''Object-Name'', None, None, None, None, None, None),
(''Object-Count'', None, None, None, None, None, None))
O, forma rápida de acceder e imprimirlos.
colnames = cursor.description
for row in colnames:
print row[0]
Produce algo como esto:
Date
Object-Name
Object-Count