Ecco due modi per restituire un elenco di tabelle in tutti i database allegati in SQLite.
Il primo metodo restituisce tutte le tabelle e visualizzazioni per tutti i database allegati.
Il secondo metodo offre la possibilità di restituire sia tabelle che viste, o solo tabelle, ma solo per il database primario.
Aggiornamento dicembre 2021 :Da quando ho scritto questo articolo, SQLite ha introdotto un'altra opzione, che ho elencato come terza opzione bonus alla fine di questo articolo.
Il comando .tables
Il modo più semplice per restituire un elenco di tabelle quando si utilizza la shell della riga di comando di SQLite è utilizzare .tables
comando.
Questo comando può essere utilizzato con o senza un argomento. Se lo usi senza fornire un argomento, restituisce tutte le tabelle (e le viste) per tutti i database allegati.
Esempio:
.tables
Risultato:
Album Employee InvoiceLine PlaylistTrack Artist Genre MediaType Track Customer Invoice Playlist
Nel mio caso, c'è un solo database allegato (il database di esempio Chinook) e tutte le tabelle di questo database vengono restituite.
Come accennato, puoi anche fornire un argomento a questo comando. Tale argomento può essere utilizzato per limitare le tabelle restituite dal comando. Ad esempio, puoi assegnare un nome a una tabella specifica oppure puoi utilizzare la corrispondenza del modello per restituire solo le tabelle che corrispondono a un determinato modello.
Esempio:
.tables a%
Risultato:
Album Artist
In questo caso vengono restituite solo le tabelle che iniziano con la lettera “a”.
Una cosa da tenere a mente è che .tables
comando restituisce entrambe le tabelle e visualizzazioni. Se desideri escludere le visualizzazioni dai risultati, puoi utilizzare la corrispondenza dei modelli per escludere le visualizzazioni. Funzionerà solo se le tue viste utilizzano una convenzione di denominazione che le distingue dalle tabelle e da altri oggetti.
Un altro modo per escludere le visualizzazioni dai risultati è eseguire una query su sqlite_schema tavolo direttamente. Sebbene questa tabella contenga anche viste, puoi utilizzare SQL per escluderle dai risultati, se necessario.
La tabella sqlite_schema
Ogni database SQLite ha uno schema_sqlite tabella che definisce lo schema per il database. È possibile utilizzare questa tabella per restituire un elenco di tabelle nel database.
Quando usi .tables
comando, è simile a fare questo:
SELECT name FROM sqlite_schema
WHERE type IN ('table','view')
AND name NOT LIKE 'sqlite_%'
ORDER BY 1;
Tuttavia, c'è una differenza.
La differenza è che questo metodo restituisce solo risultati per il primario database (il .tables
comando restituisce risultati per tutti database allegati).
L'esecuzione della query precedente restituisce il seguente risultato:
Album Artist Customer Employee Genre Invoice InvoiceLine MediaType Playlist PlaylistTrack Track
Quella query restituisce entrambe le tabelle e visualizzazioni (proprio come .tables
comando fa).
Nel mio caso non ci sono visualizzazioni, ma se vuoi escludere visualizzazioni nei risultati, usa questo:
SELECT name FROM sqlite_schema
WHERE type = 'table'
AND name NOT LIKE 'sqlite_%'
ORDER BY 1;
Risultato:
Album Artist Customer Employee Genre Invoice InvoiceLine MediaType Playlist PlaylistTrack Track
Il schema_sqlite è possibile accedere alla tabella anche utilizzando sqlite_master .
Escludi visualizzazioni
Per completezza, ecco un rapido esempio che utilizza un database con una vista. Questo database contiene una tabella (chiamata Prodotti ) e una vista (denominata vProducts ).
Connetti a SQLite/il database:
sqlite3 Store.db
Esegui .tables
comando:
.tables
Risultato:
Products vProducts
Interroga lo schema_sqlite tabella per le tabelle e visualizzazioni:
SELECT name FROM sqlite_schema
WHERE type IN ('table','view')
AND name NOT LIKE 'sqlite_%'
ORDER BY 1;
Risultato:
Products vProducts
Ora interroga sqlite_schema per le tabelle solo :
SELECT name FROM sqlite_schema
WHERE type = 'table'
AND name NOT LIKE 'sqlite_%'
ORDER BY 1;
Risultato:
Products
Tabelle temporanee
Il .table
il comando restituisce sia tabelle permanenti che temporanee. Lo schema_sqlite table contiene solo tabelle permanenti. Se devi restituire solo le tabelle temporanee, puoi interrogare sqlite_temp_schema o il suo sinonimo sqlite_temp_master .
Per restituire sia tabelle permanenti che tabelle temporanee, puoi utilizzare una query come questa:
SELECT name FROM
(SELECT * FROM sqlite_schema UNION ALL
SELECT * FROM sqlite_temp_schema)
WHERE type='table'
ORDER BY name;
3a opzione bonus:la dichiarazione pragma table_list
Da quando ho scritto questo articolo per la prima volta, SQLite ha introdotto la lista_tabella dichiarazione pragma, che elenca tabelle e viste:
PRAGMA table_list;
Vedi PRAGMA
table_list in SQLite per una panoramica e degli esempi.