¿Cómo puedo obtener la lista de columnas en una tabla para una base de datos SQLite?

102

Estoy buscando recuperar una lista de columnas en una tabla. La base de datos es la última versión de SQLite (3.6, creo). Estoy buscando un código que haga esto con una consulta SQL. Puntos de bonificación adicionales para los metadatos relacionados con las columnas (por ejemplo, longitud, tipo de datos, etc.)

AngryHacker
fuente

Respuestas:

134

Lo que está buscando se llama diccionario de datos. En sqlite, se puede encontrar una lista de todas las tablas consultando la tabla sqlite_master (¿o vista?)

sqlite> create table people (first_name varchar, last_name varchar, email_address varchar);
sqlite> select * from sqlite_master;
table|people|people|2|CREATE TABLE people (first_name varchar, last_name varchar, email_address varchar)

Para obtener información de la columna, puede usar la pragma table_info(table_name)declaración:

sqlite> pragma table_info(people);
0|first_name|varchar|0||0
1|last_name|varchar|0||0
2|email_address|varchar|0||0

Para obtener más información sobre las declaraciones pragma, consulte la documentación .

Bryan Kyle
fuente
5
¡Excelente! Ahora bien, ¿cómo se hace esto desde fuera de la línea de comandos? ¿Cómo se hace esto desde mi propio programa C?
Aaron Bratcher
¿Cómo puedo implementar lo mismo que el anterior en Objective-c?
Nag Raj
2
@Nag, creo que SQLite debería tratar estos comandos como SQL ordinario, procesarlos en consecuencia y devolverle un conjunto de resultados.
Bryan Kyle
¿No tiene sqlite algún atajo de puntos en lugar de select * from ?
jiggunjer
Usando select * from table, cuando no sabe cuántos registros en la tabla pueden tener el resultado de millones de registros y tomar tiempo y recursos. Debe agregar "límite 1" o algo parecido.
Guy Dafny
55

Esta es la forma sencilla:

.schema <table>
ifightcrime
fuente
4
Esta debería ser realmente la respuesta.
Ehtesh Choudhury
19
@EhteshChoudhury no, no debería, la pregunta solicita una consulta SQL y esta no es una.
jazzpi
25

La pregunta es antigua, pero aún no se ha mencionado lo siguiente.

Otra forma conveniente en muchos casos es activar los encabezados:

sqlite> .headers on

Luego,

sqlite> SELECT ... FROM table

mostrará un título que muestra todos los campos seleccionados (todos si SELECCIONA *) en la parte superior de la salida.

invasor
fuente
Supongo que es correcto que el problema real fue que sqlite3 no proporciona el encabezado de una consulta de forma predeterminada, entonces esa es la solución que todos hemos estado buscando . Si su tabla es demasiado larga para mostrarse en su terminal, simplemente agregue, por ejemplo LIMIT 5. No olvides el ;al final.
fralau
16

solo entra en tu shell sqlite:

$ sqlite3 path/to/db.sqlite3

y luego solo golpea

sqlite> .schema

y obtendrás todo.

Majd Taby
fuente
1
La pregunta es buscar una consulta SQL.
Erica
13

Aquí hay una declaración SELECT que enumera todas las tablas y columnas en la base de datos actual:

SELECT m.name as tableName, 
       p.name as columnName
FROM sqlite_master m
left outer join pragma_table_info((m.name)) p
     on m.name <> p.name
order by tableName, columnName
;
David Garoutte
fuente
¡Gracias! Puede ordenar por esquema si cambia su ORDER BYa tableName, p.cid.
mrm
7

Esta es una consulta que enumera todas las tablas con sus columnas y todos los metadatos que pude obtener sobre cada columna según lo solicitó OP (como puntos de bonificación).

SELECT
  m.name AS table_name, 
  p.cid AS col_id,
  p.name AS col_name,
  p.type AS col_type,
  p.pk AS col_is_pk,
  p.dflt_value AS col_default_val,
  p.[notnull] AS col_is_not_null
FROM sqlite_master m
LEFT OUTER JOIN pragma_table_info((m.name)) p
  ON m.name <> p.name
WHERE m.type = 'table'
ORDER BY table_name, col_id

Gracias a @David Garoutte por mostrarme cómo empezar pragma_table_infoa trabajar en una consulta.

Ejecute esta consulta para ver todos los metadatos de la tabla:

SELECT * FROM sqlite_master WHERE type = 'table'
lewdev
fuente
1

Sobre la base de lo anterior, puede hacerlo todo a la vez:

sqlite3 yourdb.db ".schema"

Eso le dará el SQL para crear la tabla, que es efectivamente una lista de columnas.

algunas ideas
fuente
0

Lo sé, ha pasado mucho tiempo pero nunca es demasiado tarde… Tuve una pregunta similar con TCL como intérprete y después de varias búsquedas, no encontré nada bueno para mí. Así que propongo algo basado en PRAGMA, sabiendo que su base de datos es "principal"

db eval { PRAGMA main.table_info(<your table name>) } TBL { puts $TBL(name) }

Y uso de matriz para obtener una lista

set col_list {}
db eval { PRAGMA main.table_info(<your table name>) } TBL { lappend col_list $TBL(name) }
puts $col_list
Choca Croc
fuente