Hier zijn twee manieren om een lijst van tabellen in alle gekoppelde databases in SQLite terug te geven.
De eerste methode retourneert alle tabellen en views voor alle gekoppelde databases.
De tweede methode geeft u de mogelijkheid om zowel tabellen als aanzichten terug te geven, of alleen tabellen, maar alleen voor de primaire database.
Het .tables commando
De eenvoudigste manier om een lijst met tabellen op te vragen met behulp van de SQLite command line shell is het .tables
commando te gebruiken.
Dit commando kan met of zonder argument worden gebruikt. Als u het gebruikt zonder een argument op te geven, geeft het alle tabellen (en views) voor alle gekoppelde databases.
Voorbeeld:
.tables
Resultaat:
Album Employee InvoiceLine PlaylistTrackArtist Genre MediaType Track Customer Invoice Playlist
In mijn geval is er slechts één gekoppelde database (de Chinook voorbeelddatabase), en alle tabellen van deze database worden teruggegeven.
Zoals gezegd, kunt u ook een argument opgeven voor dit commando. Een dergelijk argument kan worden gebruikt om de door het commando teruggezonden tabellen te beperken. U kunt bijvoorbeeld een specifieke tabel noemen, of u kunt patroonvergelijking gebruiken om alleen tabellen terug te geven die met een bepaald patroon overeenkomen.
Voorbeeld:
.tables a%
Resultaat:
Album Artist
In dit geval worden alleen tabellen teruggegeven die met de letter “a” beginnen.
Een ding om op te letten is dat het .tables
-commando zowel tabellen als overzichten teruggeeft. Als je views wilt uitsluiten van je resultaten, zou je pattern matching kunnen gebruiken om views uit te sluiten. Dit zal alleen werken als uw standpunten gebruik maken van een naamgeving conventie die hen onderscheidt van tabellen en andere objecten.
Een andere manier om standpunten uit te sluiten van uw resultaten is om query’s de sqlite_master tabel direct. Hoewel deze tabel ook views bevat, kunt u SQL gebruiken om ze van uw resultaten uit te sluiten als dat nodig is.
De sqlite_master tabel
Elke SQLite database heeft een sqlite_master tabel die het schema voor de database definieert. U kunt deze tabel gebruiken om een lijst van tabellen in uw database op te vragen.
Wanneer u het .tables
commando gebruikt, is het vergelijkbaar met het volgende:
SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Echter, er is een verschil.
Het verschil is dat deze methode alleen resultaten voor de primaire database retourneert (de .tables
-opdracht retourneert resultaten voor alle gekoppelde databases).
Het uitvoeren van de bovenstaande query retourneert het volgende resultaat:
AlbumArtistCustomerEmployeeGenreInvoiceInvoiceLineMediaTypePlaylistPlaylistTrackTrack
Deze query retourneert zowel tabellen als weergaven (net zoals de .tables
-opdracht doet).
In mijn geval zijn er geen views, maar als u views in de resultaten wilt uitsluiten, gebruikt u dit:
SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Resultaat:
AlbumArtistCustomerEmployeeGenreInvoiceInvoiceLineMediaTypePlaylistPlaylistTrackTrack
Exclude Views
Voor de volledigheid volgt hier een snel voorbeeld dat gebruik maakt van een database met een view. Deze database bevat één tabel (genaamd Products) en één view (genaamd vProducts).
Maak verbinding met SQLite/de database:
sqlite3 Store.db
Run het .tables
commando:
.tables
Resultaat:
Products vProducts
Vraag de sqlite_master tabel voor tabellen en views:
SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Resultaat:
ProductsvProducts
Vraag sqlite_master nu alleen voor tabellen:
SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Resultaat:
Products
Tijdelijke tabellen
Het .table commando geeft zowel permanente tabellen als tijdelijke tabellen. De sqlite_master tabel bevat alleen permanente tabellen. Als u alleen de tijdelijke tabellen wilt retourneren, kunt u een query uitvoeren in sqlite_temp_master.
Om zowel permanente tabellen als tijdelijke tabellen te retourneren, kunt u een query als deze gebruiken:
SELECT name FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master)WHERE type='table'ORDER BY name;