¿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.)

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 .


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>

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.


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.


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
;

¡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'

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.