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

StackOverflow https://stackoverflow.com/questions/604939

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

Foi útil?

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

set col_list {}
db eval { PRAGMA main.table_info(<your table name>) } TBL { lappend col_list $TBL(name) }
puts $col_list
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top