Como posso obter a lista de um colunas em uma tabela para um banco de dados SQLite?
-
03-07-2019 - |
Pergunta
Eu estou olhando para recuperar uma lista de colunas em uma tabela. O banco de dados é a última versão do SQLite (3,6, creio). Estou à procura de código que faz isso com uma consulta SQL. pontos de bônus extras para metadados relacionados às colunas (por exemplo, comprimento, tipo de dados, etc ...)
Solução
O que você está procurando é chamado de dicionário de dados. Em sqlite uma lista de todas as tabelas podem ser encontrados consultando a tabela sqlite_master (ou 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 obter informações da coluna você pode usar a instrução pragma table_info(table_name)
:
sqlite> pragma table_info(people);
0|first_name|varchar|0||0
1|last_name|varchar|0||0
2|email_address|varchar|0||0
Para mais informações sobre as declarações pragma, consulte a documentação .
Outras dicas
Aqui é a maneira simples:
.schema <table>
A questão é antiga, mas a seguinte ainda não foi mencionado.
Outra maneira conveniente em muitos casos é transformar cabeçalhos no por:
sqlite> .headers on
Em seguida,
sqlite> SELECT ... FROM table
irá exibir um título mostrando todos os campos selecionados (todos, se você SELECT *) no topo da saída.
apenas entrar em seu shell sqlite:
$ sqlite3 path/to/db.sqlite3
e, em seguida, é só apertar
sqlite> .schema
e você obterá tudo.
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
;
Esta é uma consulta que lista todas as tabelas com as suas colunas e todos os metadados eu poderia começar sobre cada coluna como OP solicitado (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
Graças ao @ David Garoutte para me mostrar como obter pragma_table_info
ao trabalho em uma consulta.
Executar esta consulta para ver todos os metadados tabela:
SELECT * sqlite_master WHERE type = 'table'
Com base no acima, 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.
Eu sei, tem sido um longo tempo, mas nunca é tarde demais ... Eu tinha uma pergunta semelhante com TCL como intérprete e depois de vários pesquisa, não encontrou nada bom para mim. Assim, proponho algo baseado em PRAGMA, sabendo que o seu DB é “principal”
db eval { PRAGMA main.table_info(<your table name>) } TBL { puts $TBL(name) }
E o uso de matriz para obter uma lista ??p>
set col_list {}
db eval { PRAGMA main.table_info(<your table name>) } TBL { lappend col_list $TBL(name) }
puts $col_list