Ecco due modi per restituire un elenco di tabelle in tutti i database allegati in SQLite.
Il primo metodo restituisce tutte le tabelle e le viste per tutti i database allegati.
Il secondo metodo ti dà la possibilità di restituire sia le tabelle che le viste, o solo le tabelle, ma solo per il database primario.
Il comando .tables
Il modo più semplice per restituire un elenco di tabelle quando si usa la shell della linea di comando SQLite è usare il comando .tables
.
Questo comando può essere usato con o senza argomento. Se lo usi senza fornire un argomento, restituisce tutte le tabelle (e le viste) per tutti i database collegati.
Esempio:
.tables
Risultato:
Album Employee InvoiceLine PlaylistTrackArtist Genre MediaType Track Customer Invoice Playlist
Nel mio caso, c’è solo un database collegato (il database campione Chinook), e tutte le tabelle di questo database sono restituite.
Come detto, puoi anche fornire un argomento a questo comando. Tale argomento può essere usato per limitare le tabelle restituite dal comando. Per esempio, si può dare un nome a una specifica tabella, o si può usare il pattern matching per restituire solo le tabelle che corrispondono a un dato schema.
Esempio:
.tables a%
Risultato:
Album Artist
In questo caso vengono restituite solo le tabelle che iniziano con la lettera “a”.
Una cosa a cui prestare attenzione è che il comando .tables
restituisce sia tabelle che viste. Se volete escludere le viste dai vostri risultati, potreste usare il pattern matching per escludere le viste. Questo funzionerà solo se le vostre viste utilizzano una convenzione di denominazione che le distingue dalle tabelle e dagli altri oggetti.
Un altro modo per escludere le viste dai vostri risultati è quello di interrogare direttamente la tabella sqlite_master. Sebbene anche questa tabella contenga delle viste, puoi usare SQL per escluderle dai tuoi risultati, se necessario.
La tabella sqlite_master
Ogni database SQLite ha una tabella sqlite_master che definisce lo schema del database. Puoi usare questa tabella per restituire un elenco di tabelle nel tuo database.
Quando usi il comando .tables
, è simile a fare così:
SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Tuttavia, c’è una differenza.
La differenza è che questo metodo restituisce solo i risultati per il database primario (il comando .tables
restituisce i risultati per tutti i database collegati).
Eseguendo la query di cui sopra si ottiene il seguente risultato:
AlbumArtistCustomerEmployeeGenreInvoiceInvoiceLineMediaTypePlaylistPlaylistTrackTrack
Questa query restituisce sia tabelle che viste (proprio come fa il comando .tables
).
Nel mio caso non ci sono viste, ma se vuoi escludere le viste dai risultati, usa questo:
SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Risultato:
AlbumArtistCustomerEmployeeGenreInvoiceInvoiceLineMediaTypePlaylistPlaylistTrackTrack
Escludere le viste
Per completezza, ecco un rapido esempio che usa un database con una vista. Questo database contiene una tabella (chiamata Products) e una vista (chiamata vProducts).
Connettiti a SQLite/al database:
sqlite3 Store.db
Esegui il comando .tables
:
.tables
Risultato:
Products vProducts
Interroga la tabella sqlite_master per tabelle e viste:
SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Risultato:
ProductsvProducts
Ora interroga sqlite_master solo per le tabelle:
SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Risultato:
Products
Tabelle temporanee
Il .table restituisce sia tabelle permanenti che tabelle temporanee. La tabella sqlite_master contiene solo tabelle permanenti. Se hai bisogno di restituire solo le tabelle temporanee, puoi interrogare sqlite_temp_master.
Per restituire sia le tabelle permanenti che quelle temporanee, puoi usare una query come questa:
SELECT name FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master)WHERE type='table'ORDER BY name;