Como listar as tabelas em um arquivo de banco de dados SQLite que foi aberto com ATTACH?

1197

Qual SQL pode ser usado para listar as tabelas e as linhas dentro dessas tabelas em um arquivo de banco de dados SQLite - depois de anexá-lo ao ATTACHcomando na ferramenta de linha de comando SQLite 3 ?

izb
fonte
1
tente este você tem informação completa de mesas http://www.sqlite.org/pragma.html#schema
Piyush
2
O seguinte é uma GUI útil para sqlite se você estiver interessado: sqlitestudio.pl Dá-lhe acesso para ver os detalhes das bases de dados, tabelas, muito rapidamente e tem um editor de consulta bom também ...
James Oravec
17
.tablespara tabelas e .schema ?TABLE?para o esquema da tabela específica.
H6
.table 'bank_%'ou .table '%_empl'também sintaxe válida para consultar prefixos / sufixos!
gavenkoa

Respostas:

576

As funções .tables, e .schema"helper" não procuram os bancos de dados ATTACHed: eles apenas consultam a SQLITE_MASTERtabela para o banco de dados "principal". Conseqüentemente, se você usou

ATTACH some_file.db AS my_db;

então você precisa fazer

SELECT name FROM my_db.sqlite_master WHERE type='table';

Observe que as tabelas temporárias também não aparecem .tables: você precisa listar sqlite_temp_masterpara isso:

SELECT name FROM sqlite_temp_master WHERE type='table';
Anthony Williams
fonte
121
"SELECT name FROM sqlite_master WHERE type='table'"funciona para mim
vladkras
3
SELECT nome FROM my_db.sqlite_master WHERE tipo = 'tabela'; isso não funciona para mim (para o DB em anexo) e ele lança erro como: não as houver mesa "my_db.sqlite_master"
kanika
o que você quis dizer com tabelas temporárias? Existe algum quando eu acabei de abrir o arquivo db SQLite?
Ewoks
Tabelas temporárias são aquelas criadas com CREATE TEMPORARY TABLEcomandos SQL. Seu conteúdo é descartado quando a conexão atual com o banco de dados é fechada e nunca é salva em um arquivo de banco de dados.
Anthony Williams
1
Sob o modo de comando sqlite3 e execute ATTACH "some_file.db" AS my_db; Ele funcionou!
John_J
1272

Existem algumas etapas para ver as tabelas em um banco de dados SQLite:

  1. Liste as tabelas no seu banco de dados:

    .tables
  2. Liste a aparência da tabela:

    .schema tablename
  3. Imprima a tabela inteira:

    SELECT * FROM tablename;
  4. Liste todos os comandos de prompt do SQLite disponíveis:

    .help
Mark Janssen
fonte
45
.tablee .tablesambos são permitidos. Por outro lado, .tatambém funcionaria, pois o sqlite3 aceitará qualquer comando que não seja ambíguo. O nome do comando de acordo com a ajuda é realmente ".tabelas" (se alguém ainda estiver prestando atenção).
dbn 6/13
29
(Essa deve ser a resposta aceita, é a maneira mais sqlite-y de fazer as coisas).
dbn 6/13
6
.tablesnão exibirá tabelas se um banco de dados aberto for aberto, ATTACH '<path>' AS <name>;mas a resposta do lasse funcionará. desde que o OP mencionou Attacking, acredito que ele estava certo ao não aceitar esta resposta. edit: apenas notei que Anthony e outros abaixo também apontaram isso.
antiplex 28/03
2
@dbw: Não necessariamente. Considere que você está criando um wrapper de banco de dados capaz de usar SQLite ou MySql (meu caso). O uso de mais comandos em conformidade com o SQL tornaria mais fácil portar o agrupado em outros idiomas, se você usar comandos específicos do fornecedor de banco de dados.
Valentin Heinitz
"... o sqlite3 aceita qualquer comando que não seja ambíguo ..." Infelizmente, às vezes, ele também aceita comandos ambíguos. Por exemplo, ".s" é interpretado como ".show", embora ".schema", '.separator "ou" .stats "também sejam possibilidades. E quando não aceita um comando ambíguo, não lista as possibilidades.
442

Parece que você precisa percorrer a tabela sqlite_master , assim:

SELECT * FROM dbname.sqlite_master WHERE type='table';

E, em seguida, passe manualmente por cada tabela com um SELECTou similar para examinar as linhas.

Os comandos .DUMPe .SCHEMAnão parecem ver o banco de dados.

Lasse V. Karlsen
fonte
120
Não é algo fácil de ler ou lembrar para uso futuro; o .tablescomando embutido é mais intuitivo
24
@ Gregllida: apesar disso ser utilizável em qualquer API-SQL, pois é uma valida SQL. Os comandos internos podem não ser suportados em todos os lugares.
Valentin Heinitz
2
@DoktorJ .tablesForam modificados para exibir tabelas de um banco de dados anexado?
Lasse V. Karlsen 26/11
4
Nesse banco de dados , sim, mas esta pergunta era sobre mostrar as tabelas em um banco de dados que você anexou. O .tablescomando foi modificado para mostrar também?
Lasse V. Karlsen
4
Doh! Compreensão de leitura falhar ... eu de alguma forma conseguiu não pegar o Anexar Referência de ... duas vezes> _ <
Doktor J
162

Para mostrar todas as tabelas, use

SELECT name FROM sqlite_master WHERE type = "table"

Para mostrar todas as linhas, acho que você pode percorrer todas as tabelas e apenas fazer um SELECT * em cada uma. Mas talvez um DUMP seja o que você procura?

Christian Davén
fonte
16
Obrigado pela única resposta que realmente abordou a questão ... "What SQL", não qual comando pode ser usado ... obrigado!
Brad Parks
Além disso, isso imprime um nome de tabela por linha, enquanto .tables imprime várias colunas de nomes de tabelas (irritante / não útil).
Shane
68

Use .helppara verificar os comandos disponíveis.

.table

Este comando mostraria todas as tabelas no seu banco de dados atual.

Antony.H
fonte
Estranho, ele deve ser correta, mas não funciona quando eu usá-lo
Jürgen K.
42

Existe um comando disponível para isso na linha de comando SQLite:

.tables ?PATTERN?      List names of tables matching a LIKE pattern

Que converte no seguinte SQL:

SELECT name FROM sqlite_master
WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'
UNION ALL
SELECT name FROM sqlite_temp_master
WHERE type IN ('table','view')
ORDER BY 1
Peter Mortensen
fonte
36

Para listar as tabelas, você também pode fazer:

SELECT name FROM sqlite_master
WHERE type='table';
Rafał Dowgird
fonte
Então ... cur.execute(""" SELECT name FROM sqlite_master WHERE type='table';""")ou não? Isso não está funcionando para mim, mas não tenho certeza de onde esse código deve ser executado.
jbuddy_13 23/04
32

Tente PRAGMA table_info(table-name);
http://www.sqlite.org/pragma.html#schema

Luiz Geron
fonte
2
Esta é provavelmente a melhor maneira de fazê-lo.
Alix Axel
7
Isso só funciona se você souber o nome da tabela. Você não pode usar isso para obter a lista de nomes de tabelas.
Eric W
24

Eu uso esta consulta para obtê-lo:

SELECT name FROM sqlite_master WHERE type='table'

E para usar no iOS:

NSString *aStrQuery=[NSString stringWithFormat:@"SELECT name FROM sqlite_master WHERE type='table'"];
Carregando o jogo
fonte
16

De acordo com a documentação , o equivalente ao MySQL ' SHOW TABLES;é:

O comando ".tables" é semelhante à configuração do modo de lista e à execução da seguinte consulta:

SELECT name FROM sqlite_master
  WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'
UNION ALL
SELECT name FROM sqlite_temp_master
  WHERE type IN ('table','view')
ORDER BY 1;

No entanto, se você estiver verificando se existe uma única tabela (ou para obter seus detalhes), consulte a resposta @LuizGeron .

Alix Axel
fonte
15

Nas versões mais recentes do SQLite 3, você pode emitir:

.fullschema

para ver todas as suas instruções de criação.

Pimenta
fonte
SQLite versão 3.7.13 2012-07-17 17:46:21 Digite ".help" para obter instruções Digite instruções SQL terminadas com ";" sqlite> .fullschema Erro: comando desconhecido ou argumentos inválidos: "fullschema". Digite ".help" para obter ajuda
Mona Jalal
2
Você está usando uma versão de 2012
pepper
12

A maneira mais fácil de fazer isso é abrir o banco de dados diretamente e usar o .dumpcomando, em vez de anexá-lo depois de chamar a ferramenta de shell do SQLite 3.

Então ... (suponha que o prompt da linha de comando do seu sistema operacional seja $) em vez de $sqlite3:

sqlite3> ATTACH database.sqlite as "attached"

Na linha de comando do sistema operacional, abra o banco de dados diretamente:

$sqlite3 database.sqlite
sqlite3> .dump
Noé
fonte
10

Via a union all, combine todas as tabelas em uma lista.

select name
from sqlite_master 
where type='table'

union all 

select name 
from sqlite_temp_master 
where type='table'
openwonk
fonte
9

Usar:

import sqlite3

TABLE_LIST_QUERY = "SELECT * FROM sqlite_master where type='table'"
Mrityunjay Singh
fonte
7

Como ninguém mencionou a referência oficial do SQLite, acho que pode ser útil fazer referência a ela sob este título:

https://www.sqlite.org/cli.html

Você pode manipular seu banco de dados usando os comandos descritos neste link. Além disso, se você estiver usando o sistema operacional Windows e não souber onde está o shell de comando, isso está no site do SQLite:

https://www.sqlite.org/download.html

Após o download, clique no arquivo sqlite3.exe para inicializar o shell de comando do SQLite . Quando é inicializada, por padrão, esta sessão SQLite está usando um banco de dados na memória, não um arquivo no disco e, portanto, todas as alterações serão perdidas quando a sessão terminar. Para usar um arquivo de disco persistente como banco de dados, digite o comando ".open ex1.db" imediatamente após a inicialização da janela do terminal.

O exemplo acima faz com que o arquivo de banco de dados chamado "ex1.db" seja aberto e usado, e criado se ele não existir anteriormente. Você pode usar um nome de caminho completo para garantir que o arquivo esteja no diretório em que você pensa. Use barras como o caractere separador de diretório. Em outras palavras, use "c: /work/ex1.db", não "c: \ work \ ex1.db".

Para ver todas as tabelas no banco de dados que você escolheu anteriormente, digite o comando .tables, conforme indicado no link acima.

Se você trabalha no Windows, acho que pode ser útil mover esse arquivo sqlite.exe para a mesma pasta dos outros arquivos Python. Dessa maneira, o arquivo Python grava e o shell SQLite lê os arquivos .db no mesmo caminho.

oiyio
fonte
5

O comando ".schema" listará as tabelas disponíveis e suas linhas, mostrando a instrução usada para criar as referidas tabelas:

sqlite> crie table_a (id int, a int, b int);
sqlite> .schema table_a
CREATE TABLE table_a (id int, a int, b int);

fonte
1

.da para ver todos os bancos de dados - um chamado ' main '

tabelas desse banco de dados podem ser vistas por

SELECT nome_tabela distinta da ordem sqlite_master por 1;

Os bancos de dados anexados precisam de prefixos que você escolheu com AS na instrução ATTACH, por exemplo, aa (, bb, cc ...), portanto:

SELECT nome_tabela distinto da ordem aa.sqlite_master por 1;

Observe que aqui você também obtém as visualizações. Para excluí-los, inclua where type = 'table' antes de 'order'

Klaas-Z4us-V
fonte