Wie liste ich die Tabellen in einer SQLite-Datenbankdatei auf, die mit ATTACH geöffnet wurde?

1197

Mit welchem SQL können die Tabellen und die Zeilen in diesen Tabellen in einer SQLite- Datenbankdatei aufgelistet werden - nachdem ich sie mit dem ATTACHBefehl im SQLite 3- Befehlszeilentool angehängt habe ?

izb
quelle
1
Versuchen Sie dieses, Sie haben vollständige Informationen über Tabellen http://www.sqlite.org/pragma.html#schema
Piyush
2
Das Folgende ist eine nützliche GUI für SQLite, wenn Sie interessiert sind: sqlitestudio.pl Ermöglicht Ihnen den Zugriff auf die Details der Datenbanken, Tabellen, sehr schnell und hat auch einen netten Abfrage-Editor ...
James Oravec
17
.tablesfür Tabellen und .schema ?TABLE?für das Schema der jeweiligen Tabelle.
H6.
.table 'bank_%'oder .table '%_empl'auch gültige Syntax zum Abfragen von Präfixen / Suffixen!
Gavenkoa

Antworten:

576

Die Funktionen .tablesund und .schema"helper" untersuchen keine ATTACHed-Datenbanken. Sie fragen lediglich die SQLITE_MASTERTabelle nach der "main" -Datenbank ab. Folglich, wenn Sie verwendet haben

ATTACH some_file.db AS my_db;

dann musst du tun

SELECT name FROM my_db.sqlite_master WHERE type='table';

Beachten Sie, dass temporäre Tabellen auch nicht angezeigt werden .tables: Sie müssen dies auflisten sqlite_temp_master:

SELECT name FROM sqlite_temp_master WHERE type='table';
Anthony Williams
quelle
121
Funktioniert nur "SELECT name FROM sqlite_master WHERE type='table'"für mich
vladkras
3
SELECT name FROM my_db.sqlite_master WHERE type = 'table'; Dies funktioniert nicht für mich (für die angehängte Datenbank) und es wird ein Fehler ausgegeben als: Es gibt keine solche Tabelle "my_db.sqlite_master"
kanika
Was meinten Sie mit temporären Tabellen? Gibt es welche, als ich gerade die SQLite-Datenbankdatei geöffnet habe?
Ewoks
Temporäre Tabellen werden mit CREATE TEMPORARY TABLESQL-Befehlen erstellt. Ihr Inhalt wird gelöscht, wenn die aktuelle Datenbankverbindung geschlossen wird, und sie werden niemals in einer Datenbankdatei gespeichert.
Anthony Williams
1
Unter sqlite3 Befehlsmodus und ausführen ATTACH "some_file.db" AS my_db; Es hat funktioniert!
John_J
1272

Es gibt einige Schritte, um die Tabellen in einer SQLite-Datenbank anzuzeigen:

  1. Listen Sie die Tabellen in Ihrer Datenbank auf:

    .tables
  2. Listen Sie auf, wie die Tabelle aussieht:

    .schema tablename
  3. Drucken Sie die gesamte Tabelle:

    SELECT * FROM tablename;
  4. Listen Sie alle verfügbaren SQLite-Eingabeaufforderungsbefehle auf:

    .help
Mark Janssen
quelle
45
.tableund .tablessind beide erlaubt. Im .taÜbrigen würde das auch funktionieren, da sqlite3 jeden Befehl akzeptiert, der eindeutig ist. Der Name des Befehls laut Hilfe ist in der Tat ".tables" (wenn noch jemand aufpasst).
dbn
29
(Dies sollte die akzeptierte Antwort sein, es ist die einfachste Art, Dinge zu tun).
dbn
6
.tableszeigt keine Tabellen an, wenn eine Datenbank geöffnet wurde, ATTACH '<path>' AS <name>;aber die Antwort von lasse reicht aus. Da das OP ATTACHing erwähnte, glaube ich, dass er Recht hatte, diese Antwort nicht zu akzeptieren. edit: habe gerade bemerkt, dass anthony und andere unten auch darauf hingewiesen haben.
Antiplex
2
@dbw: Nicht unbedingt. Angenommen, Sie führen einen DB-Wrapper aus, der SQLite oder MySql (mein Fall) verwenden kann. Die Verwendung von mehr SQL-konformen Befehlen würde es einfacher machen, die in andere Sprachen eingeschlossenen Befehle zu portieren, als wenn Sie herstellerspezifische DB-Befehle verwenden würden.
Valentin Heinitz
"... sqlite3 akzeptiert jeden Befehl, der eindeutig ist ..." Leider akzeptiert es manchmal auch mehrdeutige Befehle. Zum Beispiel wird ".s" als ".show" interpretiert, obwohl ".schema", ".separator" oder ".stats" ebenfalls Möglichkeiten wären. Und wenn es keinen mehrdeutigen Befehl akzeptiert, ist es dies listet die Möglichkeiten nicht auf.
442

Anscheinend müssen Sie die Tabelle sqlite_master folgendermaßen durchgehen :

SELECT * FROM dbname.sqlite_master WHERE type='table';

Und dann gehen Sie manuell jede Tabelle mit einem SELECToder ähnlichem durch, um die Zeilen zu betrachten.

Die Befehle .DUMPund .SCHEMAscheinen die Datenbank überhaupt nicht zu sehen.

Lasse V. Karlsen
quelle
120
Nicht leicht zu lesen oder für die zukünftige Verwendung zu merken; Der eingebaute .tablesBefehl ist intuitiver
24
@Gryllida: Trotzdem kann von jeder SQL-API verwendet werden, da es sich um valide SQL handelt. Integrierte Befehle werden möglicherweise nicht überall unterstützt.
Valentin Heinitz
2
@DoktorJ Wurden .tablesgeändert, um Tabellen aus einer angehängten Datenbank anzuzeigen?
Lasse V. Karlsen
4
In dieser Datenbank ja, aber bei dieser Frage ging es darum, die Tabellen in einer von Ihnen angehängten Datenbank anzuzeigen. Wurde der .tablesBefehl geändert, um auch diese anzuzeigen?
Lasse V. Karlsen
4
Doh! Leseverständnis fehlgeschlagen ... Ich habe es irgendwie geschafft, die ATTACH-Referenz nicht zu erfassen ... zweimal> _ <
Doktor J
162

Verwenden Sie, um alle Tabellen anzuzeigen

SELECT name FROM sqlite_master WHERE type = "table"

Um alle Zeilen anzuzeigen, können Sie wahrscheinlich alle Tabellen durchlaufen und für jede Zeile einfach ein SELECT * ausführen. Aber vielleicht ist ein DUMP das, wonach Sie suchen?

Christian Davén
quelle
16
Vielen Dank für die einzige Antwort, die sich wirklich mit der Frage befasst hat ... "Welches SQL", nicht welcher Befehl verwendet werden kann ... danke!
Brad Parks
Außerdem wird ein Tabellenname pro Zeile gedruckt, während .tables mehrere Spalten mit Tabellennamen druckt (ärgerlich / nicht nützlich).
Shane
68

Verwenden Sie .helpdiese Option , um nach verfügbaren Befehlen zu suchen.

.table

Dieser Befehl zeigt alle Tabellen in Ihrer aktuellen Datenbank an.

Antony.H
quelle
Seltsam, es muss korrekt sein, funktioniert aber nicht, wenn ich es benutze
Jürgen K.
42

In der SQLite-Befehlszeile steht hierfür ein Befehl zur Verfügung:

.tables ?PATTERN?      List names of tables matching a LIKE pattern

Welches konvertiert in die folgende SQL:

SELECT name FROM sqlite_master
WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'
UNION ALL
SELECT name FROM sqlite_temp_master
WHERE type IN ('table','view')
ORDER BY 1
Peter Mortensen
quelle
36

So listen Sie die Tabellen auf:

SELECT name FROM sqlite_master
WHERE type='table';
Rafał Dowgird
quelle
Also ... cur.execute(""" SELECT name FROM sqlite_master WHERE type='table';""")oder nein? Das funktioniert bei mir nicht, aber ich bin mir nicht sicher, wo dieser Code ausgeführt werden soll.
jbuddy_13
32

Versuchen Sie es mit PRAGMA table_info(table-name);
http://www.sqlite.org/pragma.html#schema

Luiz Geron
quelle
2
Dies ist wahrscheinlich der beste Weg, dies zu tun.
Alix Axel
7
Dies funktioniert nur, wenn Sie den Namen der Tabelle kennen. Sie können dies nicht verwenden, um die Liste der Tabellennamen abzurufen.
Eric W
24

Ich benutze diese Abfrage, um es zu bekommen:

SELECT name FROM sqlite_master WHERE type='table'

Und zur Verwendung in iOS:

NSString *aStrQuery=[NSString stringWithFormat:@"SELECT name FROM sqlite_master WHERE type='table'"];
Spiel läd
quelle
16

Laut Dokumentation ist das Äquivalent von MySQLs SHOW TABLES;:

Der Befehl ".tables" ähnelt dem Festlegen des Listenmodus und dem Ausführen der folgenden Abfrage:

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

Wenn Sie jedoch überprüfen, ob eine einzelne Tabelle vorhanden ist (oder deren Details abgerufen werden sollen ), lesen Sie die Antwort von @LuizGeron .

Alix Axel
quelle
15

Ab den neuesten Versionen von SQLite 3 können Sie Folgendes ausgeben:

.fullschema

um alle Ihre create-Anweisungen zu sehen.

Pfeffer
quelle
SQLite Version 3.7.13 2012-07-17 17:46:21 Geben Sie ".help" für Anweisungen ein. Geben Sie SQL-Anweisungen ein, die mit einem ";" sqlite> .fullschema Fehler: unbekannter Befehl oder ungültige Argumente: "fullschema". Geben Sie ".help" für Hilfe ein
Mona Jalal
2
Sie verwenden eine Version von 2012
Pfeffer
12

Der einfachste Weg, dies zu tun, besteht darin, die Datenbank direkt zu öffnen und den .dumpBefehl zu verwenden, anstatt ihn nach dem Aufrufen des SQLite 3-Shell-Tools anzuhängen.

Also ... (Angenommen, Ihre OS-Befehlszeile lautet $) anstelle von $sqlite3:

sqlite3> ATTACH database.sqlite as "attached"

Öffnen Sie die Datenbank über die Befehlszeile Ihres Betriebssystems direkt:

$sqlite3 database.sqlite
sqlite3> .dump
Noah
quelle
10

Via ein union all, kombiniert alle Tabellen in eine Liste.

select name
from sqlite_master 
where type='table'

union all 

select name 
from sqlite_temp_master 
where type='table'
openwonk
quelle
9

Verwenden:

import sqlite3

TABLE_LIST_QUERY = "SELECT * FROM sqlite_master where type='table'"
Mrityunjay Singh
quelle
7

Da niemand über die offizielle Referenz von SQLite gesprochen hat, halte ich es für nützlich, unter dieser Überschrift darauf zu verweisen:

https://www.sqlite.org/cli.html

Sie können Ihre Datenbank mit den in diesem Link beschriebenen Befehlen bearbeiten. Außerdem , wenn Sie Windows - Betriebssystem verwenden und nicht wissen , wo der Kommando - Shell ist, das ist in der Website SQLite:

https://www.sqlite.org/download.html

Nach dem Download klicken sqlite3.exe Datei , um die SQLite - Befehls - Shell zu initialisieren . Bei der Initialisierung verwendet diese SQLite-Sitzung standardmäßig eine speicherinterne Datenbank und keine Datei auf der Festplatte. Daher gehen alle Änderungen verloren, wenn die Sitzung beendet wird. Um eine persistente Festplattendatei als Datenbank zu verwenden, geben Sie unmittelbar nach dem Start des Terminalfensters den Befehl ".open ex1.db" ein.

Im obigen Beispiel wird die Datenbankdatei mit dem Namen "ex1.db" geöffnet und verwendet und erstellt, wenn sie zuvor nicht vorhanden war. Möglicherweise möchten Sie einen vollständigen Pfadnamen verwenden, um sicherzustellen, dass sich die Datei in dem Verzeichnis befindet, in dem sie sich Ihrer Meinung nach befindet. Verwenden Sie Schrägstriche als Verzeichnistrennzeichen. Mit anderen Worten, verwenden Sie "c: /work/ex1.db", nicht "c: \ work \ ex1.db".

Geben Sie den Befehl .tables ein, um alle Tabellen in der zuvor ausgewählten Datenbank anzuzeigen, wie im obigen Link angegeben.

Wenn Sie unter Windows arbeiten, ist es möglicherweise hilfreich, diese Datei sqlite.exe mit den anderen Python-Dateien in denselben Ordner zu verschieben. Auf diese Weise schreibt die Python-Datei in und die SQLite-Shell liest aus DB-Dateien und befindet sich im selben Pfad.

oiyio
quelle
5

Das Kommando ".schema" listet die verfügbaren Tabellen und ihre Zeilen auf, indem es Ihnen die Anweisung zeigt, mit der diese Tabellen erstellt wurden:

sqlite> create table_a (id int, a int, b int);
sqlite> .schema table_a
CREATE TABLE table_a (id int, a int, b int);

quelle
1

.da, um alle Datenbanken anzuzeigen - eine mit dem Namen ' main '

Tabellen dieser Datenbank können von eingesehen werden

SELECT unterscheidet tbl_name von sqlite_master um 1;

Die angehängten Datenbanken benötigen Präfixe, die Sie mit AS in der Anweisung ATTACH ausgewählt haben, z. B. aa (, bb, cc ...).

SELECT unterscheidet tbl_name von aa.sqlite_master um 1;

Beachten Sie, dass Sie hier auch die Ansichten erhalten. Um diese auszuschließen, fügen Sie hinzu, wobei type = 'table' vor 'order' steht.

Klaas-Z4us-V
quelle