Aqui estão duas maneiras de retornar uma lista de tabelas em todos os bancos de dados anexados no SQLite.
O primeiro método retorna todas as tabelas e vistas de todos os bancos de dados anexados.
O segundo método dá-lhe a opção de retornar ambas tabelas e vistas, ou apenas tabelas, mas apenas para a base de dados primária.
O comando .tables
A forma mais fácil de retornar uma lista de tabelas ao usar a shell de linha de comando SQLite é usar o comando .tables
.
Este comando pode ser usado com ou sem argumento. Se você usá-lo sem fornecer um argumento, ele retorna todas as tabelas (e vistas) para todos os bancos de dados anexados.
Exemplo:
.tables
Resultado:
Album Employee InvoiceLine PlaylistTrackArtist Genre MediaType Track Customer Invoice Playlist
No meu caso, há apenas um banco de dados anexado (o banco de dados de exemplo do Chinook), e todas as tabelas deste banco de dados são retornadas.
Como mencionado, você também pode fornecer um argumento para este comando. Tal argumento pode ser usado para limitar as tabelas retornadas pelo comando. Por exemplo, você pode nomear uma tabela específica, ou você pode usar a correspondência de padrões para retornar somente tabelas que correspondam a um dado padrão.
Exemplo:
.tables a%
Resultado:
Album Artist
Neste caso apenas tabelas que começam com a letra “a” são retornadas.
Uma coisa a ter em conta é que o comando .tables
retorna tanto as tabelas como as vistas. Se você quiser excluir as views dos seus resultados, você pode usar a combinação de padrões para excluir views. Isto só funcionará se suas views usarem uma convenção de nomes que as distinga das tabelas e outros objetos.
Outra forma de excluir views dos seus resultados é consultar diretamente a tabela sqlite_master. Embora esta tabela também contenha visualizações, você pode usar SQL para excluí-las dos seus resultados se necessário.
A tabela sqlite_master
Todos os bancos de dados SQLite têm uma tabela sqlite_master que define o esquema do banco de dados. Você pode usar essa tabela para retornar uma lista de tabelas do seu banco de dados.
Quando você usa o comando .tables
, é semelhante a fazer isto:
SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'ORDER BY 1;
No entanto, há uma diferença.
A diferença é que este método só retorna resultados para a base de dados primária (o comando .tables
retorna resultados para todas as bases de dados anexadas).
Executar a consulta acima retorna o seguinte resultado:
AlbumArtistCustomerEmployeeGenreInvoiceInvoiceLineMediaTypePlaylistPlaylistTrackTrack
Que a consulta retorna tanto as tabelas como as vistas (tal como o comando .tables
faz).
No meu caso não há nenhuma vista, mas se você quiser excluir vistas nos resultados, use isto:
SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Resultado:
AlbumArtistCustomerEmployeeGenreInvoiceInvoiceLineMediaTypePlaylistPlaylistTrackTrack
Excluir vistas
Para completar, aqui está um exemplo rápido que usa uma base de dados com uma vista. Esta base de dados contém uma tabela (chamada Produtos) e uma vista (chamada vProdutos).
Conectar ao SQLite/base de dados:
sqlite3 Store.db
Executar o comando:.tables
.tables
Resultar:
Products vProducts
Pergunte a tabela sqlite_master para tabelas e vistas:
SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Resultado:
ProductsvProducts
Pergunte a tabela sqlite_master apenas para tabelas:
SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Resultado:
Products
Tabelas Temporárias:
O .table retorna tanto as tabelas permanentes como as tabelas temporárias. A tabela sqlite_master contém apenas tabelas permanentes. Se você precisa retornar apenas as tabelas temporárias, você pode consultar sqlite_temp_master.
Para retornar tanto tabelas permanentes como temporárias, você pode usar uma consulta como esta:
SELECT name FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master)WHERE type='table'ORDER BY name;