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 ?
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.
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';
Só "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:
Liste as tabelas no seu banco de dados:
.tables
Liste a aparência da tabela:
.schema tablename
Imprima a tabela inteira:
SELECT*FROM tablename;
Liste todos os comandos de prompt do SQLite disponíveis:
.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.
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?
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 NOTLIKE'sqlite_%'UNIONALLSELECT name FROM sqlite_temp_master
WHERE type IN('table','view')ORDERBY1
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.
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 NOTLIKE'sqlite_%'UNIONALLSELECT name FROM sqlite_temp_master
WHERE type IN('table','view')ORDERBY1;
No entanto, se você estiver verificando se existe uma única tabela (ou para obter seus detalhes), consulte a resposta @LuizGeron .
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:
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:
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.
.tables
para tabelas e.schema ?TABLE?
para o esquema da tabela específica..table 'bank_%'
ou.table '%_empl'
também sintaxe válida para consultar prefixos / sufixos!Respostas:
As funções
.tables
, e.schema
"helper" não procuram os bancos de dados ATTACHed: eles apenas consultam aSQLITE_MASTER
tabela para o banco de dados "principal". Conseqüentemente, se você usouentão você precisa fazer
Observe que as tabelas temporárias também não aparecem
.tables
: você precisa listarsqlite_temp_master
para isso:fonte
"SELECT name FROM sqlite_master WHERE type='table'"
funciona para mimCREATE TEMPORARY TABLE
comandos 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.ATTACH "some_file.db" AS my_db;
Ele funcionou!Existem algumas etapas para ver as tabelas em um banco de dados SQLite:
Liste as tabelas no seu banco de dados:
Liste a aparência da tabela:
Imprima a tabela inteira:
Liste todos os comandos de prompt do SQLite disponíveis:
fonte
.table
e.tables
ambos são permitidos. Por outro lado,.ta
també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)..tables
nã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.Parece que você precisa percorrer a tabela sqlite_master , assim:
E, em seguida, passe manualmente por cada tabela com um
SELECT
ou similar para examinar as linhas.Os comandos
.DUMP
e.SCHEMA
não parecem ver o banco de dados.fonte
.tables
comando embutido é mais intuitivo.tables
Foram modificados para exibir tabelas de um banco de dados anexado?.tables
comando foi modificado para mostrar também?Para mostrar todas as tabelas, use
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?
fonte
Use
.help
para verificar os comandos disponíveis.Este comando mostraria todas as tabelas no seu banco de dados atual.
fonte
Existe um comando disponível para isso na linha de comando SQLite:
Que converte no seguinte SQL:
fonte
Para listar as tabelas, você também pode fazer:
fonte
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.Tente
PRAGMA table_info(table-name);
http://www.sqlite.org/pragma.html#schema
fonte
Eu uso esta consulta para obtê-lo:
E para usar no iOS:
fonte
De acordo com a documentação , o equivalente ao MySQL '
SHOW TABLES;
é:No entanto, se você estiver verificando se existe uma única tabela (ou para obter seus detalhes), consulte a resposta @LuizGeron .
fonte
Nas versões mais recentes do SQLite 3, você pode emitir:
para ver todas as suas instruções de criação.
fonte
A maneira mais fácil de fazer isso é abrir o banco de dados diretamente e usar o
.dump
comando, 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
:Na linha de comando do sistema operacional, abra o banco de dados diretamente:
fonte
Via a
union all
, combine todas as tabelas em uma lista.fonte
Usar:
fonte
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.
fonte
O comando ".schema" listará as tabelas disponíveis e suas linhas, mostrando a instrução usada para criar as referidas tabelas:
fonte
.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'
fonte