Der er to måder at returnere en liste over tabeller i alle tilknyttede databaser i SQLite på.
Den første metode returnerer alle tabeller og visninger for alle tilknyttede databaser.
Den anden metode giver dig mulighed for at returnere både tabeller og visninger eller kun tabeller, men kun for den primære database.
Kommandoen .tables
Den nemmeste måde at returnere en liste over tabeller på, når du bruger SQLite-kommandolinjeskallen, er ved at bruge kommandoen .tables
.
Denne kommando kan bruges med eller uden et argument. Hvis du bruger den uden at angive et argument, returnerer den alle tabeller (og visninger) for alle tilknyttede databaser.
Eksempel:
.tables
Resultat:
Album Employee InvoiceLine PlaylistTrackArtist Genre MediaType Track Customer Invoice Playlist
I mit tilfælde er der kun én tilknyttet database (Chinook-eksempeldatabasen), og alle denne databases tabeller returneres.
Som nævnt kan du også angive et argument til denne kommando. Et sådant argument kan bruges til at begrænse de tabeller, der returneres af kommandoen. Du kan f.eks. nævne en bestemt tabel, eller du kan bruge mønstermatchning til kun at returnere tabeller, der passer til et givet mønster.
Eksempel:
.tables a%
Resultat:
Album Artist
I dette tilfælde returneres kun tabeller, der begynder med bogstavet “a”.
En ting, du skal være opmærksom på, er, at kommandoen .tables
returnerer både tabeller og visninger. Hvis du ønsker at udelukke visninger fra dine resultater, kan du bruge mønstermatchning til at udelukke visninger. Dette vil kun fungere, hvis dine visninger bruger en navnekonvention, der adskiller dem fra tabeller og andre objekter.
En anden måde at udelukke visninger fra dine resultater på er at forespørge direkte i sqlite_master-tabellen. Selv om denne tabel også indeholder visninger, kan du bruge SQL til at udelukke dem fra dine resultater, hvis det er nødvendigt.
Tabellen sqlite_master
Alle SQLite-databaser har en sqlite_master-tabel, der definerer skemaet for databasen. Du kan bruge denne tabel til at returnere en liste over tabeller i din database.
Når du bruger kommandoen .tables
, svarer det til at gøre dette:
SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Der er dog en forskel.
Den forskel er, at denne metode kun returnerer resultater for den primære database (.tables
-kommandoen returnerer resultater for alle tilknyttede databaser).
Kørsel af ovenstående forespørgsel returnerer følgende resultat:
AlbumArtistCustomerEmployeeGenreInvoiceInvoiceLineMediaTypePlaylistPlaylistTrackTrack
Denne forespørgsel returnerer både tabeller og visninger (ligesom .tables
-kommandoen gør det).
I mit tilfælde er der ikke nogen visninger, men hvis du vil udelukke visninger i resultaterne, skal du bruge dette:
SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Resultat:
AlbumArtistCustomerEmployeeGenreInvoiceInvoiceLineMediaTypePlaylistPlaylistTrackTrack
Exclude Views
For fuldstændighedens skyld er her et hurtigt eksempel, der bruger en database med en visning. Denne database indeholder én tabel (kaldet Products) og én visning (kaldet vProducts).
Opret forbindelse til SQLite/databasen:
sqlite3 Store.db
Kør kommandoen .tables
:
.tables
Resultat:
Products vProducts
Forsøg sqlite_master-tabellen for tabeller og visninger:
SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Resultat:
ProductsvProducts
Forsøg nu sqlite_master kun for tabeller:
SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Resultat:
Products
Temporære tabeller
Den .table-kommandoen returnerer både permanente tabeller og midlertidige tabeller. Tabellen sqlite_master indeholder kun permanente tabeller. Hvis du kun skal returnere de midlertidige tabeller, kan du forespørge sqlite_temp_master.
For at returnere både permanente tabeller og midlertidige tabeller kan du bruge en forespørgsel som denne:
SELECT name FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master)WHERE type='table'ORDER BY name;