Gibt es eine SQLite-Entsprechung zu DESCRIBE [Tabelle] von MySQL?

441

Ich fange gerade erst an, SQLite zu lernen . Es wäre schön, die Details für eine Tabelle wie die von MySQL sehen zu können DESCRIBE [table]. PRAGMA table_info [table]ist nicht gut genug, da es nur grundlegende Informationen enthält (zum Beispiel wird nicht angezeigt, ob eine Spalte ein Feld ist oder nicht). Hat SQLite eine Möglichkeit, dies zu tun?

Matthew
quelle

Antworten:

559

Das SQLite-Befehlszeilenprogramm verfügt über einen .schema TABLENAMEBefehl, der Ihnen die create-Anweisungen anzeigt.

Ned Batchelder
quelle
65
Sie können ".schema" ohne Tabelle verwenden und es werden Ihnen alle angezeigt.
Dan Benamy
43
Vergessen Sie nicht, das Semikolon am Ende der Erklärung
wegzulassen
10
Ein Semikolon ist nicht erforderlich
Simon
40
@Simon Ein Semikolon führt dazu, dass der Befehl stillschweigend fehlschlägt .
Djeikyb
4
@djeikyb. Sollte dies nicht als Fehler angesehen werden?
Makan Tayebi
292
PRAGMA table_info([tablename]);
Strater
quelle
19
Dies scheint eher der Beschreibung von MySQL zu entsprechen als .schema tablenamemir.
Tybro0103
2
Ja. Das hat bei mir funktioniert. .schema TABLENAME nicht. .schema allein zeigt Ihnen jedoch alle create-Anweisungen, aber das Ergebnis von PRAGMA ist viel nützlicher, wenn ich nur eine Tabelle betrachten möchte.
Dev Kanchen
15
Dies scheint die akzeptierte Antwort zu sein, da sie durch Abfragen funktioniert, anstatt von einer Befehlszeilenschnittstelle abhängig zu sein. +1 von mir.
Akoi Meexx
Nachtrag: Das einzige, was mir auffällt, ist, dass PRIMARY KEY nicht ausgegeben wird, wenn ich eine Tabelle mit INTEGER PRIMARY KEY erstelle, sondern nur INTEGER.
Akoi Meexx
3
@AkoiMeexx: Aus meiner ursprünglichen Frage: "Ist PRAGMA table_info [table]nicht gut genug, da es nur grundlegende Informationen enthält (zum Beispiel zeigt es nicht an, ob eine Spalte ein Feld ist oder nicht)."
Matthew
115

Suchen Sie nach SQL, mit dem eine Tabelle generiert wird? Dazu können Sie die sqlite_masterTabelle abfragen :

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
quelle
Gibt es einen Unterschied zwischen diesem und .schema foo?
Matthew
15
@Matthew: .schemakann nur über eine Befehlszeile verwendet werden; Die obigen Befehle können als Abfrage über eine Bibliothek (Python, C # usw.) ausgeführt werden.
Mark Rushakoff
@ MarkRushakoff Aber das Ergebnis ist das gleiche?
dvb
2
+1 "SELECT * FROM sqlite_master" funktioniert in Chrome Entwickler - Tool , wenn das Debuggen WebSQL
contactmatt
52

So zeigen Sie alle Tabellen an:

.tables

So zeigen Sie eine bestimmte Tabelle an:

.schema [tablename]
Ross Snyder
quelle
6

Um zu verhindern, dass Menschen durch einige der Kommentare zu den anderen Antworten irregeführt werden:

  1. Wenn .schemaoder query from sqlite_masterkeine Ausgabe gibt, gibt es eine nicht vorhandene tablename, zB dies auch durch einen verursacht werden können ;Semikolon am Ende für .schema, .tables, ... Oder nur , weil die Tabelle existiert nicht wirklich. Das .schemafunktioniert einfach nicht ist sehr unwahrscheinlich und dann sollte ein Fehlerbericht beim sqlite-Projekt abgelegt werden.

... .schema kann nur über eine Befehlszeile verwendet werden. Die obigen Befehle> können als Abfrage über eine Bibliothek (Python, C # usw.) ausgeführt werden. - Mark Rushakoff 25. Juli 10 um 21:09 Uhr

  1. "Kann nur über eine Befehlszeile verwendet werden" kann Personen irreführen. Fast jede (wahrscheinlich jede?) Programmiersprache kann andere Programme / Befehle aufrufen. Daher ist der zitierte Kommentar unglücklich, da das Aufrufen eines anderen Programms in diesem Fall sqliteeher unterstützt wird, als dass die Sprache ein wrapper/ libraryfür jedes Programm bereitstellt (was nicht nur aufgrund der Natur der Massen von Programmen da draußen zu Unvollständigkeit neigt , wirkt aber auch gegen single-source principle, kompliziert maintenanceund fördert das Chaos der Daten in der Welt.
Radagast
quelle
1
Jeder, der ein Programm zum Abrufen von Daten aus einer SQL-Datenbank schreibt, sollte die richtigen SQL-Treiber verwenden, die seiner Programmiersprache zur Verfügung stehen, um auf die Datenbank zuzugreifen und Abfragen durchzuführen. Dies ist der geeignete Weg, um auf eine Datenbank zuzugreifen. Ich würde niemals empfehlen, ein Befehlszeilenprogramm zu hacken, das Ad-hoc-Abfragen bereitstellt. Ihr Vorschlag ist zutiefst falsch. Ein Befehlszeilenprogramm für Ad-hoc-Abfragen ist BESTIMMT NICHT der am besten geeignete Zugriffspunkt für Programmcode zum Ausführen von Abfragen in einer Datenbank. Die Verwendung von SQL-Treibern ist mit Sicherheit NICHT "kompliziert" - es wird empfohlen.
Medlock Perlman
Ich bin damit einverstanden, dass es nicht schlecht ist, es ähnelt Bibliotheken. Aus diesem Grund vertreiben Linux | BSD Paketmanager. Und warum gibt es 0install plattformübergreifende PM. Ich wollte nur klarstellen, dass nicht alle Programme Wrapper benötigen. Es macht nicht jedes Mal Sinn. In diesem Fall (DB-Handling) ist es natürlich keine schlechte Idee, einen Wrapper zu verwenden.
Radagast
1

Wenn Sie ein grafisches Werkzeug verwenden. Es zeigt Ihnen das Schema direkt neben dem Tabellennamen. Im Fall von DB Browser For Sqlite klicken Sie auf, um die Datenbank zu öffnen (obere rechte Ecke), navigieren Sie und öffnen Sie Ihre Datenbank. Die Informationen werden in der folgenden Tabelle angezeigt.

Geben Sie hier die Bildbeschreibung ein

Klicken Sie mit der rechten Maustaste auf den Datensatz / Tabellennamen, klicken Sie auf Kopie erstellen Anweisung und dort haben Sie es.

Ich hoffe, es hat einigen Anfängern geholfen, die nicht mit der Kommandozeile arbeiten konnten.

Mujeeb Ishaque
quelle