SQLite
 sql >> Base de données >  >> RDS >> SQLite

2 façons de lister les tables dans une base de données SQLite

Voici deux façons de renvoyer une liste de tables dans toutes les bases de données attachées dans SQLite.

La première méthode renvoie toutes les tables et vues pour toutes les bases de données attachées.

La deuxième méthode vous donne la possibilité de renvoyer à la fois des tables et des vues, ou uniquement des tables, mais uniquement pour la base de données principale.

Mise à jour décembre 2021  :Depuis la rédaction de cet article, SQLite a introduit une autre option, que j'ai répertoriée comme une troisième option bonus à la fin de cet article.

La commande .tables

Le moyen le plus simple de renvoyer une liste de tables lors de l'utilisation du shell de ligne de commande SQLite est d'utiliser le .tables commande.

Cette commande peut être utilisée avec ou sans argument. Si vous l'utilisez sans fournir d'argument, il renvoie toutes les tables (et vues) pour toutes les bases de données attachées.

Exemple :

.tables

Résultat :

Album          Employee       InvoiceLine    PlaylistTrack
Artist         Genre          MediaType      Track        
Customer       Invoice        Playlist     

Dans mon cas, il n'y a qu'une seule base de données attachée (l'exemple de base de données 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 renvoyées par la commande. Par exemple, vous pouvez nommer une table spécifique ou vous pouvez utiliser la correspondance de modèle pour renvoyer uniquement les tables qui correspondent à un modèle donné.

Exemple :

.tables a%

Résultat :

Album   Artist

Dans ce cas, seuls les tableaux commençant par la lettre "a" sont renvoyés.

Une chose à garder à l'esprit est que le .tables la commande renvoie les deux tables et vues. Si vous souhaitez exclure des vues de vos résultats, vous pouvez utiliser la correspondance de modèle pour exclure des vues. Cela ne fonctionnera que si vos vues utilisent une convention de dénomination qui les distingue des tables et autres objets.

Une autre façon d'exclure des vues de vos résultats consiste à interroger le sqlite_schema tableau directement. Bien que ce tableau contienne également des vues, vous pouvez utiliser SQL pour les exclure de vos résultats si nécessaire.

Le tableau sqlite_schema

Chaque base de données SQLite a un sqlite_schema table qui définit le schéma de la base de données. Vous pouvez utiliser cette table pour renvoyer une liste des tables de votre base de données.

Lorsque vous utilisez les .tables commande, cela revient à faire ceci :

SELECT name FROM sqlite_schema 
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 le primaire base de données (les .tables la commande renvoie des résultats pour tous bases de données attachées).

L'exécution de la requête ci-dessus renvoie le résultat suivant :

Album
Artist
Customer
Employee
Genre
Invoice
InvoiceLine
MediaType
Playlist
PlaylistTrack
Track

Cette requête renvoie les deux tables et vues (tout comme les .tables commande le fait).

Dans mon cas, il n'y a pas de vues, mais si vous souhaitez exclure des vues dans les résultats, utilisez ceci :

SELECT name FROM sqlite_schema 
WHERE type = 'table' 
AND name NOT LIKE 'sqlite_%'
ORDER BY 1;

Résultat :

Album
Artist
Customer
Employee
Genre
Invoice
InvoiceLine
MediaType
Playlist
PlaylistTrack
Track

Le sqlite_schema la table est également accessible en utilisant sqlite_master .

Exclure des vues

Par souci d'exhaustivité, 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 vProducts ).

Connectez-vous à SQLite/la base de données :

sqlite3 Store.db

Exécutez le .tables commande :

.tables

Résultat :

Products   vProducts

Interrogez le sqlite_schema table pour les tables et vues :

SELECT name FROM sqlite_schema 
WHERE type IN ('table','view') 
AND name NOT LIKE 'sqlite_%'
ORDER BY 1;

Résultat :

Products
vProducts

Interrogez maintenant sqlite_schema pour les tableaux uniquement :

SELECT name FROM sqlite_schema 
WHERE type = 'table' 
AND name NOT LIKE 'sqlite_%'
ORDER BY 1;

Résultat :

Products

Tableaux temporaires

Le .table La commande renvoie à la fois les tables permanentes et les tables temporaires. Le sqlite_schema table ne contient que des tables permanentes. Si vous devez renvoyer uniquement les tables temporaires, vous pouvez interroger sqlite_temp_schema ou son synonyme sqlite_temp_master .

Pour renvoyer à la fois des tables permanentes et des tables temporaires, vous pouvez utiliser une requête comme celle-ci :

SELECT name FROM 
   (SELECT * FROM sqlite_schema UNION ALL
    SELECT * FROM sqlite_temp_schema)
WHERE type='table'
ORDER BY name;

3ème option bonus :l'instruction pragma table_list

Depuis que j'ai écrit cet article pour la première fois, SQLite a introduit la table_list déclaration pragma, qui répertorie les tables et les vues :

PRAGMA table_list;

Voir PRAGMA table_list dans SQLite pour un aperçu et des exemples.