Como posso obter a lista de colunas em uma tabela para um banco de dados SQLite?

102

Estou tentando recuperar uma lista de colunas em uma tabela. O banco de dados é a versão mais recente do SQLite (3.6, acredito). Estou procurando um código que faça isso com uma consulta SQL. Pontos de bônus extras para metadados relacionados às colunas (por exemplo, comprimento, tipo de dados, etc ...)

AngryHacker
fonte

Respostas:

134

O que você está procurando é chamado de dicionário de dados. No sqlite, uma lista de todas as tabelas pode ser encontrada consultando a tabela sqlite_master (ou visualização?)

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 obter informações da coluna, você pode usar a pragma table_info(table_name)instrução:

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

Para obter mais informações sobre as declarações pragma, consulte a documentação .

Bryan Kyle
fonte
5
Ótimo! Agora, como isso é feito fora da linha de comando? Como isso é feito no meu próprio programa C?
Aaron Bratcher
como posso implementar o mesmo que acima em Objective-c
Nag Raj
2
@Nag, eu acho que o SQLite deveria apenas tratar esses comandos como SQL comum, processá-los de acordo e retornar um conjunto de resultados.
Bryan Kyle
o sqlite não tem algum atalho de ponto em vez de select * from ?
jiggunjer de
Usando select * from table, quando você não sabe quantos registros na tabela podem ter resultado de milhões de registros e levar tempo e recursos. Você deve adicionar "limite 1" ou algo parecido.
Guy Dafny
55

Esta é a maneira mais simples:

.schema <table>
crime noturno
fonte
4
Essa realmente deveria ser a resposta.
Ehtesh Choudhury
19
@EhteshChoudhury não, não deveria, a questão pede uma consulta SQL e esta não é.
jazzpi
25

A pergunta é antiga, mas o seguinte ainda não foi mencionado.

Outra maneira conveniente em muitos casos é ativar os cabeçalhos:

sqlite> .headers on

Então,

sqlite> SELECT ... FROM table

exibirá um título mostrando todos os campos selecionados (todos se você SELECIONAR *) no topo da saída.

invasor
fonte
Acho que está correto que o problema real era que sqlite3 não fornece o cabeçalho de uma consulta por padrão, então essa é a solução que todos nós temos procurado . Se sua mesa for muito longa para ser exibida em seu terminal, basta adicionar, por exemplo LIMIT 5. Não se esqueça do ;no final.
fralau
16

basta entrar em seu shell sqlite:

$ sqlite3 path/to/db.sqlite3

e então basta apertar

sqlite> .schema

e você terá tudo.

Majd Taby
fonte
1
A questão é procurar uma consulta SQL.
Erica,
13

Aqui está uma instrução SELECT que lista todas as tabelas e colunas no banco de dados atual:

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
fonte
Obrigado! Você pode solicitar por esquema se alterar o ORDER BYpara tableName, p.cid.
mrm
7

Esta é uma consulta que lista todas as tabelas com suas colunas e todos os metadados que pude obter sobre cada coluna conforme solicitado pelo OP (como pontos de bônus).

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

Obrigado a @David Garoutte por me mostrar como pragma_table_infotrabalhar em uma consulta.

Execute esta consulta para ver todos os metadados da tabela:

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

Com base no acima exposto, você pode fazer tudo de uma vez:

sqlite3 yourdb.db ".schema"

Isso lhe dará o SQL para criar a tabela, que é efetivamente uma lista das colunas.

algumas ideias
fonte
0

Eu sei, já faz muito tempo, mas nunca é tarde ... Tive uma pergunta semelhante com o TCL como intérprete e depois de várias pesquisas, não encontrei nada de bom para mim. Então, proponho algo baseado no PRAGMA, sabendo que seu DB é “principal”

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

E o array usa para obter uma lista

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