Comment lister les tables dans un fichier de base de données SQLite qui a été ouvert avec ATTACH?
1197
Quel SQL peut être utilisé pour répertorier les tables et les lignes de ces tables dans un fichier de base de données SQLite - une fois que je l'ai attaché avec la ATTACHcommande sur l' outil de ligne de commande SQLite 3 ?
Ce qui suit est une interface graphique utile pour sqlite si vous êtes intéressé: sqlitestudio.pl Vous donne accès pour voir les détails des bases de données, des tables, très rapidement et dispose également d'un bel éditeur de requête ...
James Oravec
17
.tablespour les tables et .schema ?TABLE?pour le schéma de la table spécifique.
H6.
.table 'bank_%'ou .table '%_empl'aussi une syntaxe valide pour interroger les préfixes / suffixes!
gavenkoa
Réponses:
576
Les fonctions .tableset .schema"helper" ne regardent pas dans les bases de données ATTACHed: elles interrogent simplement la SQLITE_MASTERtable pour la base de données "principale". Par conséquent, si vous avez utilisé
ATTACH some_file.db AS my_db;
alors vous devez faire
SELECT name FROM my_db.sqlite_master WHERE type='table';
Notez que les tables temporaires n'apparaissent pas non .tablesplus: vous devez lister sqlite_temp_masterpour cela:
SELECT name FROM sqlite_temp_master WHERE type='table';
Ne "SELECT name FROM sqlite_master WHERE type='table'"fonctionne que pour moi
vladkras
3
SELECT nom FROM my_db.sqlite_master WHERE type = 'table'; cela ne fonctionne pas pour moi (pour la base de données attachée) et cela génère une erreur comme: aucune table de ce type n'existe "my_db.sqlite_master"
kanika
qu'entendez-vous par tables temporaires? Y en a-t-il quand je viens d'ouvrir le fichier db SQLite?
Ewoks
Les tables temporaires sont celles créées avec CREATE TEMPORARY TABLEdes commandes SQL. Leur contenu est supprimé lorsque la connexion à la base de données actuelle est fermée et ils ne sont jamais enregistrés dans un fichier de base de données.
Anthony Williams
1
Sous le mode de commande sqlite3 et exécutez ATTACH "some_file.db" AS my_db; Cela a fonctionné!
John_J
1272
Il y a quelques étapes pour voir les tables dans une base de données SQLite:
Listez les tables dans votre base de données:
.tables
Indiquez à quoi ressemble le tableau:
.schema tablename
Imprimez l'intégralité du tableau:
SELECT*FROM tablename;
Répertoriez toutes les commandes d'invite SQLite disponibles:
.tableet .tablessont tous deux autorisés. D'ailleurs, .tacela fonctionnerait également, car sqlite3 acceptera toute commande sans ambiguïté. Le nom de la commande selon l'aide est en effet ".tables" (si quelqu'un fait encore attention).
dbn
29
(Cela devrait être la réponse acceptée, c'est la façon la plus sqlite-y de faire les choses).
dbn
6
.tablesn'affichera pas les tables si une base de données est ouverte, ATTACH '<path>' AS <name>;mais la réponse de lasse fera l'affaire. puisque l'OP a mentionné la FIXATION, je crois qu'il avait raison de ne pas accepter cette réponse. edit: vient de remarquer que anthony et d'autres ci-dessous l'ont également souligné.
antiplex
2
@dbw: Pas nécessairement. Considérez que vous faites un wrapper DB capable d'utiliser SQLite ou MySql (mon cas). L'utilisation de commandes plus conformes à SQL faciliterait le portage du wrappé dans d'autres langues que si vous utilisiez des commandes spécifiques au fournisseur de base de données.
Valentin Heinitz
"... sqlite3 acceptera toute commande sans ambiguïté ..." Malheureusement, il accepte parfois aussi des commandes ambiguës. Par exemple, ".s" est interprété comme ".show", même si ".schema", '.separator "ou" .stats "seraient également des possibilités. Et quand il n'accepte pas une commande ambiguë, il ne répertorie pas les possibilités
442
Il semble que vous devez parcourir la table sqlite_master , comme ceci:
SELECT*FROM dbname.sqlite_master WHERE type='table';
Et puis passez manuellement à travers chaque table avec un SELECT ou similaire pour regarder les lignes.
Les commandes .DUMPet .SCHEMAne semblent pas du tout voir la base de données.
Pas quelque chose de facile à lire ou à retenir pour une utilisation future; la .tablescommande intégrée est plus intuitive
24
@Gryllida: malgré cela, il est utilisable à partir de n'importe quelle API SQL car il s'agit d'un SQL valide. Les commandes intégrées peuvent ne pas être prises en charge partout.
Valentin Heinitz
2
@DoktorJ Ont .tablesété modifiés pour afficher les tables d'une base de données attachée?
Lasse V. Karlsen
4
Dans cette base de données , oui, mais cette question concernait l'affichage des tables dans une base de données que vous avez jointe. La .tablescommande a-t-elle été modifiée pour les afficher également?
Lasse V. Karlsen
4
Ah! La compréhension de la lecture échoue ... J'ai réussi à ne pas attraper la référence ATTACH ... deux fois> _ <
Doktor J
162
Pour afficher tous les tableaux, utilisez
SELECT name FROM sqlite_master WHERE type ="table"
Pour afficher toutes les lignes, je suppose que vous pouvez parcourir toutes les tables et simplement faire un SELECT * sur chacune. Mais peut-être qu'un DUMP est ce que vous recherchez?
Étrange, cela doit être correct, mais ne fonctionne pas lorsque je l'utilise
Jürgen K.
42
Il existe une commande disponible pour cela sur la ligne de commande SQLite:
.tables ?PATTERN? List names of tables matching a LIKE pattern
Qui convertit en SQL suivant:
SELECT name FROM sqlite_master
WHERE type IN('table','view')AND name NOTLIKE'sqlite_%'UNIONALLSELECT name FROM sqlite_temp_master
WHERE type IN('table','view')ORDERBY1
Donc... cur.execute(""" SELECT name FROM sqlite_master WHERE type='table';""") ou non? Cela ne fonctionne pas pour moi, mais je ne sais pas où ce code est censé être exécuté.
Selon la documentation , l'équivalent de MySQLs SHOW TABLES;est:
La commande ".tables" est similaire à la définition du mode liste, puis à l'exécution de la requête suivante:
SELECT name FROM sqlite_master
WHERE type IN('table','view')AND name NOTLIKE'sqlite_%'UNIONALLSELECT name FROM sqlite_temp_master
WHERE type IN('table','view')ORDERBY1;
Cependant, si vous vérifiez si une seule table existe (ou pour obtenir ses détails), voir la réponse @LuizGeron .
SQLite version 3.7.13 2012-07-17 17:46:21 Entrez ".help" pour les instructions Entrez les instructions SQL terminées par un ";" sqlite> .fullschema Erreur: commande inconnue ou arguments invalides: "fullschema". Entrez ".help" pour obtenir de l'aide
Mona Jalal
2
Vous utilisez une version de 2012
poivre
12
La façon la plus simple de le faire est d'ouvrir directement la base de données et d'utiliser la .dumpcommande, plutôt que de la joindre après avoir appelé l'outil shell SQLite 3.
Donc ... (supposez que votre invite de ligne de commande du système d'exploitation est $) au lieu de $sqlite3:
sqlite3> ATTACH database.sqlite as"attached"
Depuis la ligne de commande de votre système d'exploitation, ouvrez directement la base de données:
Vous pouvez manipuler votre base de données à l'aide des commandes décrites dans ce lien. De plus, si vous utilisez Windows OS et que vous ne savez pas où se trouve le shell de commande, c'est sur le site de SQLite:
Après l'avoir téléchargé, cliquez sur le fichier sqlite3.exe pour initialiser le shell de commande SQLite . Lorsqu'elle est initialisée, par défaut, cette session SQLite utilise une base de données en mémoire, pas un fichier sur le disque, et donc toutes les modifications seront perdues à la fermeture de la session. Pour utiliser un fichier disque persistant comme base de données, entrez la commande ".open ex1.db" immédiatement après le démarrage de la fenêtre de terminal.
L'exemple ci-dessus provoque l'ouverture et l'utilisation du fichier de base de données nommé «ex1.db» et sa création s'il n'existe pas auparavant. Vous souhaiterez peut-être utiliser un chemin d'accès complet pour vous assurer que le fichier se trouve dans le répertoire dans lequel vous pensez qu'il se trouve. Utilisez des barres obliques comme caractère de séparation de répertoire. En d'autres termes, utilisez "c: /work/ex1.db", pas "c: \ work \ ex1.db".
Pour voir toutes les tables de la base de données que vous avez précédemment choisie, tapez la commande .tables comme indiqué dans le lien ci-dessus.
Si vous travaillez sous Windows, je pense qu'il pourrait être utile de déplacer ce fichier sqlite.exe dans le même dossier que les autres fichiers Python. De cette façon, le fichier Python écrit dans et le shell SQLite lit à partir des fichiers .db sont dans le même chemin.
.tables
pour les tables et.schema ?TABLE?
pour le schéma de la table spécifique..table 'bank_%'
ou.table '%_empl'
aussi une syntaxe valide pour interroger les préfixes / suffixes!Réponses:
Les fonctions
.tables
et.schema
"helper" ne regardent pas dans les bases de données ATTACHed: elles interrogent simplement laSQLITE_MASTER
table pour la base de données "principale". Par conséquent, si vous avez utiliséalors vous devez faire
Notez que les tables temporaires n'apparaissent pas non
.tables
plus: vous devez listersqlite_temp_master
pour cela:la source
"SELECT name FROM sqlite_master WHERE type='table'"
fonctionne que pour moiCREATE TEMPORARY TABLE
des commandes SQL. Leur contenu est supprimé lorsque la connexion à la base de données actuelle est fermée et ils ne sont jamais enregistrés dans un fichier de base de données.ATTACH "some_file.db" AS my_db;
Cela a fonctionné!Il y a quelques étapes pour voir les tables dans une base de données SQLite:
Listez les tables dans votre base de données:
Indiquez à quoi ressemble le tableau:
Imprimez l'intégralité du tableau:
Répertoriez toutes les commandes d'invite SQLite disponibles:
la source
.table
et.tables
sont tous deux autorisés. D'ailleurs,.ta
cela fonctionnerait également, car sqlite3 acceptera toute commande sans ambiguïté. Le nom de la commande selon l'aide est en effet ".tables" (si quelqu'un fait encore attention)..tables
n'affichera pas les tables si une base de données est ouverte,ATTACH '<path>' AS <name>;
mais la réponse de lasse fera l'affaire. puisque l'OP a mentionné la FIXATION, je crois qu'il avait raison de ne pas accepter cette réponse. edit: vient de remarquer que anthony et d'autres ci-dessous l'ont également souligné.Il semble que vous devez parcourir la table sqlite_master , comme ceci:
Et puis passez manuellement à travers chaque table avec un
SELECT
ou similaire pour regarder les lignes.Les commandes
.DUMP
et.SCHEMA
ne semblent pas du tout voir la base de données.la source
.tables
commande intégrée est plus intuitive.tables
été modifiés pour afficher les tables d'une base de données attachée?.tables
commande a-t-elle été modifiée pour les afficher également?Pour afficher tous les tableaux, utilisez
Pour afficher toutes les lignes, je suppose que vous pouvez parcourir toutes les tables et simplement faire un SELECT * sur chacune. Mais peut-être qu'un DUMP est ce que vous recherchez?
la source
Utilisez
.help
pour vérifier les commandes disponibles.Cette commande afficherait toutes les tables de votre base de données actuelle.
la source
Il existe une commande disponible pour cela sur la ligne de commande SQLite:
Qui convertit en SQL suivant:
la source
Pour répertorier les tableaux, vous pouvez également:
la source
cur.execute(""" SELECT name FROM sqlite_master WHERE type='table';""")
ou non? Cela ne fonctionne pas pour moi, mais je ne sais pas où ce code est censé être exécuté.Essayez
PRAGMA table_info(table-name);
http://www.sqlite.org/pragma.html#schema
la source
J'utilise cette requête pour l'obtenir:
Et pour utiliser dans iOS:
la source
Selon la documentation , l'équivalent de MySQLs
SHOW TABLES;
est:Cependant, si vous vérifiez si une seule table existe (ou pour obtenir ses détails), voir la réponse @LuizGeron .
la source
Depuis les dernières versions de SQLite 3, vous pouvez émettre:
pour voir toutes vos instructions create.
la source
La façon la plus simple de le faire est d'ouvrir directement la base de données et d'utiliser la
.dump
commande, plutôt que de la joindre après avoir appelé l'outil shell SQLite 3.Donc ... (supposez que votre invite de ligne de commande du système d'exploitation est $) au lieu de
$sqlite3
:Depuis la ligne de commande de votre système d'exploitation, ouvrez directement la base de données:
la source
Via a
union all
, combinez toutes les tables en une seule liste.la source
Utilisation:
la source
Étant donné que personne n'a mentionné la référence officielle de SQLite, je pense qu'il peut être utile de s'y référer sous cette rubrique:
https://www.sqlite.org/cli.html
Vous pouvez manipuler votre base de données à l'aide des commandes décrites dans ce lien. De plus, si vous utilisez Windows OS et que vous ne savez pas où se trouve le shell de commande, c'est sur le site de SQLite:
https://www.sqlite.org/download.html
Après l'avoir téléchargé, cliquez sur le fichier sqlite3.exe pour initialiser le shell de commande SQLite . Lorsqu'elle est initialisée, par défaut, cette session SQLite utilise une base de données en mémoire, pas un fichier sur le disque, et donc toutes les modifications seront perdues à la fermeture de la session. Pour utiliser un fichier disque persistant comme base de données, entrez la commande ".open ex1.db" immédiatement après le démarrage de la fenêtre de terminal.
L'exemple ci-dessus provoque l'ouverture et l'utilisation du fichier de base de données nommé «ex1.db» et sa création s'il n'existe pas auparavant. Vous souhaiterez peut-être utiliser un chemin d'accès complet pour vous assurer que le fichier se trouve dans le répertoire dans lequel vous pensez qu'il se trouve. Utilisez des barres obliques comme caractère de séparation de répertoire. En d'autres termes, utilisez "c: /work/ex1.db", pas "c: \ work \ ex1.db".
Pour voir toutes les tables de la base de données que vous avez précédemment choisie, tapez la commande .tables comme indiqué dans le lien ci-dessus.
Si vous travaillez sous Windows, je pense qu'il pourrait être utile de déplacer ce fichier sqlite.exe dans le même dossier que les autres fichiers Python. De cette façon, le fichier Python écrit dans et le shell SQLite lit à partir des fichiers .db sont dans le même chemin.
la source
Le commando ".schema" listera les tables disponibles et leurs lignes, en vous montrant l'instruction utilisée pour créer lesdites tables:
la source
.da pour voir toutes les bases de données - une appelée « principale »
les tables de cette base de données peuvent être vues par
SELECT tbl_name distinct de sqlite_master ordre par 1;
Les bases de données attachées ont besoin des préfixes que vous avez choisis avec AS dans l'instruction ATTACH eg aa (, bb, cc ...) donc:
SELECT tbl_name distinct de aa.sqlite_master ordre par 1;
Notez qu'ici, vous obtenez également les vues. Pour les exclure, ajoutez where type = 'table' avant 'order'
la source