Voici deux façons de retourner une liste des tables de toutes les bases de données attachées en SQLite.
La première méthode renvoie toutes les tables et vues de toutes les bases de données attachées.
La deuxième méthode vous donne la possibilité de retourner à la fois les tables et les vues, ou seulement les tables, mais seulement pour la base de données primaire.
La commande .tables
La façon la plus simple de retourner une liste de tables lors de l’utilisation du shell de ligne de commande SQLite est d’utiliser la commande .tables
.
Cette commande peut être utilisée avec ou sans argument. Si vous l’utilisez sans fournir d’argument, elle renvoie toutes les tables (et vues) pour toutes les bases de données attachées.
Exemple:
.tables
Résultat:
Album Employee InvoiceLine PlaylistTrackArtist Genre MediaType Track Customer Invoice Playlist
Dans mon cas, il n’y a qu’une seule base de données attachée (la base de données échantillon Chinook), et toutes les tables de cette base de données sont renvoyées.
Comme mentionné, vous pouvez également fournir un argument à cette commande. Un tel argument peut être utilisé pour limiter les tables retournées par la commande. Par exemple, vous pouvez nommer une table spécifique, ou vous pouvez utiliser le filtrage par motif pour retourner uniquement les tables qui correspondent à un motif donné.
Exemple:
.tables a%
Résultat:
Album Artist
Dans ce cas, seules les tables qui commencent par la lettre « a » sont retournées.
Une chose dont il faut tenir compte est que la commande .tables
retourne à la fois les tables et les vues. Si vous voulez exclure les vues de vos résultats, vous pourriez utiliser la correspondance de motifs pour exclure les vues. Cela ne fonctionnera que si vos vues utilisent une convention de dénomination qui les distingue des tables et des autres objets.
Une autre façon d’exclure les vues de vos résultats est d’interroger directement la table sqlite_master. Bien que cette table contienne également des vues, vous pouvez utiliser SQL pour les exclure de vos résultats si nécessaire.
La table sqlite_master
Chaque base de données SQLite possède une table sqlite_master qui définit le schéma de la base de données. Vous pouvez utiliser cette table pour retourner une liste des tables de votre base de données.
Lorsque vous utilisez la commande .tables
, c’est similaire à faire ceci :
SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Cependant, il y a une différence.
La différence est que cette méthode ne renvoie que les résultats pour la base de données primaire (la commande .tables
renvoie les résultats pour toutes les bases de données attachées).
L’exécution de la requête ci-dessus renvoie le résultat suivant:
AlbumArtistCustomerEmployeeGenreInvoiceInvoiceLineMediaTypePlaylistPlaylistTrackTrack
Cette requête renvoie à la fois les tables et les vues (tout comme la commande .tables
le fait).
Dans mon cas, il n’y a pas de vues, mais si vous voulez exclure les vues dans les résultats, utilisez ceci:
SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Résultat:
AlbumArtistCustomerEmployeeGenreInvoiceInvoiceLineMediaTypePlaylistPlaylistTrackTrack
Exclure les vues
Pour être complet, voici un exemple rapide qui utilise une base de données avec une vue. Cette base de données contient une table (appelée Produits) et une vue (appelée vProduits).
Connexion à SQLite/la base de données:
sqlite3 Store.db
Exécution de la commande .tables
:
.tables
Résultat :
Products vProducts
Interroger la table sqlite_master pour les tables et les vues:
SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Résultat:
ProductsvProducts
Interroger maintenant sqlite_master pour les tables seulement:
SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Résultat:
Products
Tables temporaires
La commande .table renvoie à la fois des tables permanentes et des tables temporaires. La table sqlite_master ne contient que des tables permanentes. Si vous devez renvoyer uniquement les tables temporaires, vous pouvez interroger sqlite_temp_master.
Pour renvoyer à la fois les tables permanentes et les tables temporaires, vous pouvez utiliser une requête comme celle-ci:
SELECT name FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master)WHERE type='table'ORDER BY name;
.