Existe-t-il un équivalent SQLite à DESCRIBE [table] de MySQL?

443

Je commence tout juste à apprendre SQLite . Ce serait bien de pouvoir voir les détails d'une table, comme celle de MySQL DESCRIBE [table]. PRAGMA table_info [table]n'est pas assez bon, car il ne contient que des informations de base (par exemple, il ne montre pas si une colonne est un champ quelconque). SQLite a-t-il un moyen de le faire?

Matthieu
la source

Réponses:

561

L' utilitaire de ligne de commande SQLite possède une .schema TABLENAMEcommande qui vous montre les instructions create.

Ned Batchelder
la source
66
Vous pouvez utiliser ".schema" sans table et il vous les montrera tous.
Dan Benamy
43
N'oubliez pas de laisser de côté le point-virgule à la fin de la déclaration
RTF
10
Un point-virgule n'est pas requis
Simon
40
@Simon un point-virgule entraînera l' échec silencieux de la commande .
djeikyb
4
@djeikyb. cela ne devrait-il pas être considéré comme un bug?
Makan Tayebi
292
PRAGMA table_info([tablename]);
Strater
la source
19
Cela semble plus équivalent à la description de MySQL qu'à .schema tablenamemoi.
tybro0103
2
Oui. Cela a fonctionné pour moi. .schema TABLENAME ne l'a pas fait. Seul .schema, cependant, vous montre toutes les instructions create, mais le résultat de PRAGMA est beaucoup plus utile si je veux juste regarder une table.
Dev Kanchen
15
Il semble que ce devrait être la réponse acceptée, car elle fonctionne par interrogation au lieu d'être dépendante d'une interface de ligne de commande. +1 de moi.
Akoi Meexx
Addendum: La seule chose que je remarque, c'est qu'il ne génère pas de PRIMARY KEY lorsque je crée une table avec INTEGER PRIMARY KEY, juste INTEGER.
Akoi Meexx
3
@AkoiMeexx: D'après ma question d'origine: " PRAGMA table_info [table]n'est pas assez bon, car il ne contient que des informations de base (par exemple, il ne montre pas si une colonne est un champ quelconque)".
Matthew
116

Recherchez-vous le SQL utilisé pour générer une table? Pour cela, vous pouvez interroger la sqlite_mastertable :

sqlite> CREATE TABLE foo (bar INT, quux TEXT);
sqlite> SELECT * FROM sqlite_master;
table|foo|foo|2|CREATE TABLE foo (bar INT, quux TEXT)
sqlite> SELECT sql FROM sqlite_master WHERE name = 'foo';
CREATE TABLE foo (bar INT, quux TEXT)
Mark Rushakoff
la source
Y a-t-il une différence entre cela et .schema foo?
Matthew
15
@Matthew: .schemane peut être utilisé qu'à partir d'une ligne de commande; les commandes ci-dessus peuvent être exécutées comme une requête via une bibliothèque (Python, C #, etc.).
Mark Rushakoff
@MarkRushakoff Mais le résultat est le même?
dvb
2
+1 "SELECT * FROM sqlite_master" fonctionne en chrome outils de dev lors de débogage websql
contactmatt
52

Pour voir tous les tableaux:

.tables

Pour voir un tableau particulier:

.schema [tablename]
Ross Snyder
la source
6

Pour éviter que les gens soient induits en erreur par certains des commentaires des autres réponses:

  1. Si .schemaou query from sqlite_masterdonne pas de sortie, il indique un non-existant tablename, par exemple , cela peut aussi être causée par un ;point - virgule à la fin pour .schema, .tables... Ou tout simplement parce que la table existe vraiment pas. Cela .schemane fonctionne tout simplement pas est très improbable, puis un rapport de bogue doit être déposé sur le projet sqlite.

... .schema ne peut être utilisé qu'à partir d'une ligne de commande; les commandes ci-dessus> peuvent être exécutées comme une requête via une bibliothèque (Python, C #, etc.). - Mark Rushakoff 25 juillet 10 à 21:09

  1. 'ne peut être utilisé qu'à partir d'une ligne de commande' peut induire les gens en erreur. Presque tous les langages de programmation (probablement tous?) Peuvent appeler d'autres programmes / commandes. Par conséquent, le commentaire cité est malchanceux car appeler un autre programme, dans ce cas sqlite, est plus susceptible d'être pris en charge que le langage fournit un wrapper/ librarypour chaque programme (qui est non seulement sujet à l'incomplétude par la nature même des masses de programmes là-bas , mais aussi contre-agissant single-source principle, compliquant maintenance, favorisant le chaos des données dans le monde).
Radagast
la source
1
Quiconque écrit un programme pour récupérer des données à partir de n'importe quelle base de données SQL doit utiliser les pilotes SQL appropriés disponibles dans son langage de programmation pour accéder à la base de données et effectuer des requêtes sur celle-ci. C'est le moyen approprié d'accéder à une base de données. Je ne recommanderais jamais de pirater un programme en ligne de commande conçu pour fournir des requêtes ad hoc. Votre suggestion est profondément erronée. Un programme en ligne de commande pour les requêtes ad hoc n'est certainement PAS le point d'accès le plus approprié pour que le code du programme exécute des requêtes sur une base de données. L'utilisation de pilotes SQL n'est CERTAINEMENT PAS «compliquant la maintenance» - c'est la meilleure pratique.
Medlock Perlman
Je suis d'accord, ce n'est pas mal, c'est similaire aux bibliothèques. C'est pourquoi les distributions Linux | BSD expédient les gestionnaires de paquets. Et pourquoi il y a 0installation multiplateforme PM. Mon point était juste de clarifier que tous les programmes n'ont pas besoin de wrappers. Cela n'a pas de sens à chaque fois. Dans ce cas (gestion des bases de données), ce n'est évidemment pas une mauvaise idée d'utiliser un wrapper.
Radagast
1

Si vous utilisez un outil graphique. Il vous montre le schéma juste à côté du nom de la table. Dans le cas du navigateur DB pour Sqlite , cliquez pour ouvrir la base de données (coin supérieur droit), naviguez et ouvrez votre base de données, vous verrez les informations renseignées dans le tableau ci-dessous.

entrez la description de l'image ici

faites un clic droit sur l'enregistrement / nom_table, cliquez sur copier créer l'instruction et vous l'avez.

J'espère que cela a aidé un débutant qui n'a pas réussi à travailler avec la ligne de commande.

Mujeeb Ishaque
la source