Här är två sätt att returnera en lista över tabeller i alla bifogade databaser i SQLite.
Den första metoden returnerar alla tabeller och vyer för alla bifogade databaser.
Den andra metoden ger dig möjlighet att returnera både tabeller och vyer, eller bara tabeller, men bara för den primära databasen.
Uppdatering dec 2021 :Sedan jag skrev den här artikeln har SQLite introducerat ett annat alternativ, som jag har listat som ett tredje bonusalternativ i slutet av den här artikeln.
Kommandot .tables
Det enklaste sättet att returnera en lista med tabeller när du använder SQLites kommandoradsskal är att använda .tables
kommando.
Detta kommando kan användas med eller utan ett argument. Om du använder det utan att ange ett argument, returnerar det alla tabeller (och vyer) för alla bifogade databaser.
Exempel:
.tables
Resultat:
Album Employee InvoiceLine PlaylistTrack Artist Genre MediaType Track Customer Invoice Playlist
I mitt fall finns det bara en bifogad databas (Chinook-exempeldatabasen), och alla denna databas tabeller returneras.
Som nämnts kan du också ge ett argument till detta kommando. Ett sådant argument kan användas för att begränsa tabellerna som returneras av kommandot. Du kan till exempel namnge en specifik tabell, eller så kan du använda mönstermatchning för att endast returnera tabeller som matchar ett givet mönster.
Exempel:
.tables a%
Resultat:
Album Artist
I det här fallet returneras endast tabeller som börjar med bokstaven "a".
En sak att tänka på är att .tables
kommandot returnerar både tabellerna och åsikter. Om du vill utesluta vyer från dina resultat kan du använda mönstermatchning för att utesluta vyer. Detta fungerar bara om dina vyer använder en namnkonvention som skiljer dem från tabeller och andra objekt.
Ett annat sätt att utesluta vyer från dina resultat är att fråga sqlite_schema bord direkt. Även om den här tabellen också innehåller vyer kan du använda SQL för att utesluta dem från dina resultat om det behövs.
Sqlite_schema-tabellen
Varje SQLite-databas har ett sqlite_schema tabell som definierar schemat för databasen. Du kan använda den här tabellen för att returnera en lista med tabeller i din databas.
När du använder .tables
kommando, det liknar att göra detta:
SELECT name FROM sqlite_schema
WHERE type IN ('table','view')
AND name NOT LIKE 'sqlite_%'
ORDER BY 1;
Det finns dock en skillnad.
Skillnaden är att den här metoden endast returnerar resultat för den primära databasen (.tables
kommandot returnerar resultat för alla bifogade databaser).
Att köra ovanstående fråga returnerar följande resultat:
Album Artist Customer Employee Genre Invoice InvoiceLine MediaType Playlist PlaylistTrack Track
Den frågan returnerar både tabellerna och vyer (precis som .tables
kommandot gör).
I mitt fall finns det inga vyer, men om du vill utesluta vyer i resultaten, använd detta:
SELECT name FROM sqlite_schema
WHERE type = 'table'
AND name NOT LIKE 'sqlite_%'
ORDER BY 1;
Resultat:
Album Artist Customer Employee Genre Invoice InvoiceLine MediaType Playlist PlaylistTrack Track
sqlite_schema Tabellen kan också nås genom att använda sqlite_master .
Uteslut visningar
För fullständighetens skull, här är ett snabbt exempel som använder en databas med en vy. Den här databasen innehåller en tabell (kallad Produkter ) och en vy (kallad vProducts ).
Anslut till SQLite/databasen:
sqlite3 Store.db
Kör .tables
kommando:
.tables
Resultat:
Products vProducts
Fråga sqlite_schema tabell för tabeller och visningar:
SELECT name FROM sqlite_schema
WHERE type IN ('table','view')
AND name NOT LIKE 'sqlite_%'
ORDER BY 1;
Resultat:
Products vProducts
Fråga nu sqlite_schema endast för tabeller :
SELECT name FROM sqlite_schema
WHERE type = 'table'
AND name NOT LIKE 'sqlite_%'
ORDER BY 1;
Resultat:
Products
Tillfälliga tabeller
.table
kommandot returnerar både permanenta tabeller och temporära tabeller. sqlite_schema Tabell innehåller endast permanenta tabeller. Om du bara behöver returnera de tillfälliga tabellerna kan du fråga sqlite_temp_schema eller dess synonym sqlite_temp_master .
För att returnera både permanenta tabeller och temporära tabeller kan du använda en fråga som denna:
SELECT name FROM
(SELECT * FROM sqlite_schema UNION ALL
SELECT * FROM sqlite_temp_schema)
WHERE type='table'
ORDER BY name;
Bonus 3:e alternativet:table_list Pragma Statement
Sedan jag först skrev den här artikeln har SQLite introducerat tabelllistan pragma uttalande, som listar tabeller och vyer:
PRAGMA table_list;
Se PRAGMA
table_list i SQLite för en översikt och exempel.