Existe um SQLite equivalente ao DESCRIBE [tabela] do MySQL?

441

Estou apenas começando a aprender SQLite . Seria bom poder ver os detalhes de uma tabela, como o MySQL DESCRIBE [table]. PRAGMA table_info [table]não é bom o suficiente, pois possui apenas informações básicas (por exemplo, não mostra se uma coluna é um campo de algum tipo ou não). O SQLite tem uma maneira de fazer isso?

Mateus
fonte

Respostas:

559

O utilitário de linha de comando SQLite possui um .schema TABLENAMEcomando que mostra as instruções de criação.

Ned Batchelder
fonte
65
Você pode usar ".schema" sem uma tabela e ela mostrará todos eles.
precisa saber é o seguinte
43
Não se esqueça de deixar de fora o ponto-e-vírgula no final da declaração
RTF
10
Um ponto-e-vírgula não é necessário.
Simon
40
@ Um ponto e vírgula fará com que o comando falhe silenciosamente .
Djeikyb 22/05
4
@djeikyb. isso não deveria ser considerado um bug?
Makan Tayebi
292
PRAGMA table_info([tablename]);
Strater
fonte
19
Isso parece mais equivalente à descrição do MySQL do que .schema tablenamea mim.
tybro0103
2
Sim. Isso funcionou para mim. .schema TABLENAME não. O .schema sozinho, no entanto, mostra todas as instruções de criação, mas o resultado do PRAGMA é muito mais útil se eu quiser apenas olhar para uma tabela.
precisa saber é o seguinte
15
Parece que deve ser a resposta aceita, pois funciona através de consultas em vez de depender de uma interface de linha de comando. +1 de mim.
Akoi Meexx
Adendo: A única coisa que noto é que ele não gera PRIMARY KEY quando crio uma tabela com INTEGER PRIMARY KEY, apenas INTEGER.
Akoi Meexx
3
@AkoiMeexx: Da minha pergunta original: " PRAGMA table_info [table]não é bom o suficiente, pois possui apenas informações básicas (por exemplo, não mostra se uma coluna é um campo de algum tipo ou não)".
Matthew
115

Você está procurando o SQL usado para gerar uma tabela? Para isso, você pode consultar a sqlite_mastertabela :

sqlite> CREATE TABLE foo (bar INT, quux TEXT);
sqlite> SELECT * FROM sqlite_master;
table|foo|foo|2|CREATE TABLE foo (bar INT, quux TEXT)
sqlite> SELECT sql FROM sqlite_master WHERE name = 'foo';
CREATE TABLE foo (bar INT, quux TEXT)
Mark Rushakoff
fonte
Existe alguma diferença entre isso e .schema foo?
Mateus
15
@ Matthew: .schemasó pode ser usado em uma linha de comando; os comandos acima podem ser executados como uma consulta através de uma biblioteca (Python, C # etc.).
Mark Rushakoff
@MarkRushakoff Mas o resultado é o mesmo?
DVB
2
+1 "SELECT * FROM sqlite_master" trabalha em cromo ferramentas dev quando depuração WebSQL
contactmatt
52

Para ver todas as tabelas:

.tables

Para ver uma tabela específica:

.schema [tablename]
Ross Snyder
fonte
6

Para impedir que as pessoas sejam enganadas por alguns dos comentários das outras respostas:

  1. Se .schemaou query from sqlite_masternão dá qualquer saída, ele indica um inexistente tablename, por exemplo, isso também pode ser causada por um ;ponto e vírgula no fim para .schema, .tables... Ou apenas porque a tabela realmente não existe. Isso .schemasimplesmente não funciona é muito improvável e, em seguida, um relatório de bug deve ser arquivado no projeto sqlite.

... .schema só pode ser usado em uma linha de comando; os comandos acima> podem ser executados como uma consulta através de uma biblioteca (Python, C #, etc.). # Mark Rushakoff Jul 25 '10 às 21:09

  1. 'só pode ser usado a partir de uma linha de comando' pode enganar as pessoas. Quase qualquer linguagem de programação (provavelmente toda?) Pode chamar outros programas / comandos. Portanto, o comentário citado é azarado, pois chamar outro programa, nesse caso sqlite, é mais provável que seja suportado do que o idioma fornece um wrapper/ librarypara cada programa (o que não é apenas propenso a incompletude pela própria natureza das massas de programas por aí. , mas também é contra-ação single-source principle, complicando maintenance, promovendo o caos de dados no mundo).
Radagast
fonte
1
Qualquer pessoa que esteja escrevendo um programa para recuperar dados de qualquer banco de dados SQL deve usar os drivers SQL adequados disponíveis em sua linguagem de programação para acessar o banco de dados e realizar consultas nele. Essa é a maneira apropriada de acessar um banco de dados. Eu nunca recomendaria invadir um programa de linha de comando projetado para fornecer consultas ad-hoc. Sua sugestão está profundamente enganada. Um programa de linha de comando para consultas ad-hoc NÃO É CERTAMENTE o ponto de acesso mais apropriado para o código do programa executar consultas em um banco de dados. O uso de drivers SQL NÃO É CERTAMENTE 'complicar a manutenção' - é uma prática recomendada.
precisa
Concordo que não é ruim, é semelhante a bibliotecas. É por isso que o Linux | BSD distribui os gerenciadores de pacotes. E por que existe 0install PM multiplataforma. Meu objetivo era apenas esclarecer que nem todos os programas precisam de invólucros. Não faz sentido o tempo todo. Nesse caso (manipulação de banco de dados), é claro que não é uma má idéia usar um wrapper.
Radagast
1

Se você estiver usando uma ferramenta gráfica. Ele mostra o esquema ao lado do nome da tabela. No caso do DB Browser For Sqlite , clique para abrir o banco de dados (canto superior direito), navegar e abrir seu banco de dados, você verá as informações preenchidas na tabela como abaixo.

insira a descrição da imagem aqui

clique com o botão direito do mouse no registro / table_name, clique em copy create statement e pronto.

Espero que tenha ajudado alguns iniciantes que não conseguiram trabalhar com a linha de comando.

Mujeeb Ishaque
fonte