Database.Guide

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;

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.