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

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 .


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>

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.


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.


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
;

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'

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.