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.)

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 .


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>

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.


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.


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
;

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'

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.