Wie kann ich die Liste einer Spalte in einer Tabelle für eine SQLite-Datenbank abrufen?

102

Ich möchte eine Liste von Spalten in einer Tabelle abrufen. Die Datenbank ist die neueste Version von SQLite (3.6, glaube ich). Ich suche nach Code, der dies mit einer SQL-Abfrage tut. Zusätzliche Bonuspunkte für Metadaten in Bezug auf die Spalten (z. B. Länge, Datentyp usw.)

AngryHacker
quelle

Antworten:

134

Was Sie suchen, heißt Datenwörterbuch. In sqlite finden Sie eine Liste aller Tabellen, indem Sie die Tabelle sqlite_master (oder die Ansicht?) Abfragen.

sqlite> create table people (first_name varchar, last_name varchar, email_address varchar);
sqlite> select * from sqlite_master;
table|people|people|2|CREATE TABLE people (first_name varchar, last_name varchar, email_address varchar)

Um Spalteninformationen zu erhalten, können Sie die folgende pragma table_info(table_name)Anweisung verwenden:

sqlite> pragma table_info(people);
0|first_name|varchar|0||0
1|last_name|varchar|0||0
2|email_address|varchar|0||0

Weitere Informationen zu den Pragma-Anweisungen finden Sie in der Dokumentation .

Bryan Kyle
quelle
5
Toll! Wie geht das nun von außerhalb der Kommandozeile? Wie geht das in meinem eigenen C-Programm?
Aaron Bratcher
Wie kann ich das gleiche wie oben in Objective-c
Nag Raj
2
@Nag, ich würde Ihnen denken, dass SQLite diese Befehle einfach als normales SQL behandeln, entsprechend verarbeiten und Ihnen eine Ergebnismenge zurückgeben sollte.
Bryan Kyle
Hat SQLite keine Punktverknüpfung anstelle von select * from ?
Jiggunjer
Verwenden Sie select * from table, wenn Sie nicht wissen, wie viele Datensätze in der Tabelle möglicherweise aus Millionen von Datensätzen resultieren, und Zeit und Ressourcen benötigen. Sie sollten "Limit 1" oder ähnliches hinzufügen.
Guy Dafny
55

Hier ist der einfache Weg:

.schema <table>
ifightcrime
quelle
4
Dies sollte wirklich die Antwort sein.
Ehtesh Choudhury
19
@EhteshChoudhury nein, sollte es nicht, die Frage fragt nach einer SQL-Abfrage und dies ist keine.
Jazzpi
25

Die Frage ist alt, aber das Folgende wurde noch nicht erwähnt.

Eine andere bequeme Möglichkeit in vielen Fällen ist das Aktivieren von Headern durch:

sqlite> .headers on

Dann,

sqlite> SELECT ... FROM table

zeigt eine Überschrift mit allen ausgewählten Feldern (alle, wenn Sie SELECT * auswählen) oben in der Ausgabe an.

Eindringling
quelle
Ich vermute, dass das eigentliche Problem darin bestand, dass sqlite3 standardmäßig nicht den Header einer Abfrage bereitstellt. Dann ist dies die Lösung, nach der wir alle gesucht haben . Wenn Ihre Tabelle zu lang ist, um auf Ihrem Terminal angezeigt zu werden, fügen Sie einfach hinzu, z LIMIT 5. Vergessen Sie das ;am Ende nicht.
Fralau
16

Gehen Sie einfach in Ihre SQLite-Shell:

$ sqlite3 path/to/db.sqlite3

und dann einfach schlagen

sqlite> .schema

und du wirst alles bekommen.

Majd Taby
quelle
1
Die Frage sucht nach einer SQL-Abfrage.
Erica
13

Hier ist eine SELECT-Anweisung, die alle Tabellen und Spalten in der aktuellen Datenbank auflistet:

SELECT m.name as tableName, 
       p.name as columnName
FROM sqlite_master m
left outer join pragma_table_info((m.name)) p
     on m.name <> p.name
order by tableName, columnName
;
David Garoutte
quelle
Vielen Dank! Sie können nach Schema bestellen , wenn Sie Ihre ändern ORDER BYzu tableName, p.cid.
Herr
7

Dies ist eine Abfrage, die alle Tabellen mit ihren Spalten und alle Metadaten auflistet, die ich zu jeder Spalte erhalten konnte, wenn OP angefordert wurde (als Bonuspunkte).

SELECT
  m.name AS table_name, 
  p.cid AS col_id,
  p.name AS col_name,
  p.type AS col_type,
  p.pk AS col_is_pk,
  p.dflt_value AS col_default_val,
  p.[notnull] AS col_is_not_null
FROM sqlite_master m
LEFT OUTER JOIN pragma_table_info((m.name)) p
  ON m.name <> p.name
WHERE m.type = 'table'
ORDER BY table_name, col_id

Vielen Dank an @David Garoutte, der mir gezeigt hat, wie ich pragma_table_infoin einer Abfrage arbeiten kann.

Führen Sie diese Abfrage aus, um alle Tabellenmetadaten anzuzeigen:

SELECT * FROM sqlite_master WHERE type = 'table'
lewdev
quelle
1

Aufbauend auf dem oben Gesagten können Sie alles auf einmal tun:

sqlite3 yourdb.db ".schema"

Dadurch erhalten Sie die SQL zum Erstellen der Tabelle, bei der es sich effektiv um eine Liste der Spalten handelt.

einige Ideen
quelle
0

Ich weiß, es ist lange her, aber es ist nie zu spät ... Ich hatte eine ähnliche Frage mit TCL als Dolmetscher und fand nach mehreren Suchen nichts Gutes für mich. Also schlage ich etwas vor, das auf PRAGMA basiert, da ich weiß, dass Ihre Datenbank "main" ist.

db eval { PRAGMA main.table_info(<your table name>) } TBL { puts $TBL(name) }

Und Array verwenden, um eine Liste zu erhalten

set col_list {}
db eval { PRAGMA main.table_info(<your table name>) } TBL { lappend col_list $TBL(name) }
puts $col_list
Choca Croc
quelle