Wie liste ich alle Spalten für eine bestimmte Tabelle auf?

Ich suche nach einer genauen Information in einer Datenbank, über die ich keine Kenntnisse habe.

Es ist ein Produkt von Drittanbietern, sie beantworten einige Fragen nur langsam, und ich weiß, dass die Daten in dieser Datenbank liegen, daher möchte ich ein wenig Retro-Engineering betreiben.

Gegeben Ist es in einer Tabelle möglich, eine Liste der Namen der Spalten für diese Tabelle zu haben?

In SqlServer ist es beispielsweise möglich, eine Tabelle in eine wiederverwendbare Anweisungen, die alle Spalten, aus denen die Tabelle besteht, in Textform auflisten.

Kommentare

  • Welche Art von Zugriff müssen Sie haben? Die Datenbank?
  • @dezso befindet sich auf einem separaten Computer, aber ich kann mich bei ihr anmelden und die psql-Befehlszeile mit Administratorrechten starten.
  • Wenn ich Sie richtig verstehe, Sie sind nach \dt[+] table_name in psql.
  • nein. \ dt + nicht scheint den Spaltennamen nicht explizit anzuzeigen. Es wird nur ein " Beschreibung " -Feld hinzugefügt.
  • aber \ d + Tabellenname funktioniert!

Antwort

Zusätzlich zu der Befehlszeile \d+ <table_name>, die Sie bereits gefunden haben, können Sie Verwenden Sie auch das Informationsschema , um die Spaltendaten mit information_schema.columns :

SELECT * FROM information_schema.columns WHERE table_schema = "your_schema" AND table_name = "your_table" ; 

Hinweis: Stellen Sie gemäß dem obigen Beispiel sicher, dass die Werte in Anführungszeichen eingeschlossen sind.

Kommentare

  • Verwenden Sie in psql \x on oder \pset expanded on, um die Abfrage durchzuführen Ergebnisse linear (statt tabellarisch) und daher leichter zu lesen stackoverflow.com/a/9605093/513397
  • In aktuellen Versionen (ausprobiert) in 9.6) können Sie in psql \d+ public.* die Beschreibung (Schema + Indeces / Fkeys / Trigger) aller Ihrer Tabellen und Ansichten im public Schema. Wir verwenden es in unserem Pre-Commit-Hook-Skript, um die Änderungen in der Datenbank zu verfolgen, die durch jedes Commit vorgenommen wurden.
  • SELECT Spaltenname, um nur den Spaltennamen

Antwort

Als Ergänzung zu den anderen Antworten macht selbst eine SELECT-Anweisung, die keine Zeilen zurückgibt, die Spaltennamen für Sie und den Anwendungscode verfügbar.

select * from table_name where false; 

Berechtigungen können bei jedem dieser Ansätze ins Spiel kommen.

Kommentare

  • Ich nehme an, Sie möchten diese SQL an den Befehl psql übergeben. Ich schlage vor, in diesem Fall die Option –no-psqlrc zu verwenden, um Überraschungen in der Ausgabe zu vermeiden.
  • Mit Ausnahme der ausgeblendeten Spalten, die angegeben werden mussten, um ausgewählt zu werden (wie pg_class.oid)

Antwort

Die Informationsschema ist der langsame und sichere Weg: Es ist standardisiert und weitgehend auf andere Datenbanken portierbar, die es unterstützen. Und es funktioniert weiterhin in allen Hauptversionen.

Ansichten im Informationsschema werden jedoch häufig hinzugefügt Viele Tabellen aus den Systemkatalogen erfüllen strikt die Anforderungen standardisiertes Format – von denen viele die meiste Zeit nur tote Fracht sind. Dies macht sie langsam .
Die Postgres-Entwickler machen keine Versprechungen, sondern Grundlagen (wie das, was hier benötigt wird) wird sich in den Hauptversionen nicht ändern.

psql (die native Befehlszeilenschnittstelle) nimmt natürlich die Überholspur und fragt die Quelle direkt ab . Wenn Sie psql mit dem Parameter -E starten, steht die SQL dahinter Backslash-Befehle wie \d werden angezeigt. Oder \set ECHO_HIDDEN on über die psql-Befehlszeile. Von dort aus können Sie eine Antwort auf Ihre Frage erstellen.

Bei einer Tabelle ist es möglich, eine Liste der Namen der Spalten dafür zu haben Tabelle.

SELECT attrelid::regclass AS tbl , attname AS col , atttypid::regtype AS datatype -- more attributes? FROM pg_attribute WHERE attrelid = "myschema.mytable"::regclass -- table name, optionally schema-qualified AND attnum > 0 AND NOT attisdropped ORDER BY attnum; 

Schneller als information_schema.columns . Versuchen Sie EXPLAIN ANALYZE, sich selbst davon zu überzeugen. Für eine einmalige Suche ist das immer noch kaum von Bedeutung. Kann jedoch einen Unterschied machen, wenn es in einer Abfrage / Funktion verwendet wird, die viele Male wiederholt wird.

Es gibt auch geringfügige Unterschiede in der Sichtbarkeit. Detaillierter Vergleich:

Kommentare

  • Wirklich so zeigst du dir -E und zeigst den Leuten, wie man die SQL von psql bekommt.
  • Ich stimme zu.Ich habe einige Geschwindigkeitstests durchgeführt und der pg_catalog wird mehr als zweimal so schnell ausgeführt.

Antwort

psql unter PostgreSQL 11+

Wenn Sie in einer Abfrage nach den Spaltentypen suchen, können Sie psql „s \gdesc

SELECT NULL AS zero, 1 AS one, 2.0 AS two, "three" AS three, $1 AS four, sin($2) as five, "foo"::varchar(4) as six, CURRENT_DATE AS now \gdesc Column | Type --------+---------------------- zero | text one | integer two | numeric three | text four | text five | double precision six | character varying(4) now | date (8 rows) 

Antwort

Nur PostgreSQL

Dies ist etwas hokey, könnte aber ein Konkurrent sein, wenn Sie nach dem kürzestmöglichen SQL suchen:

SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, "{}"::JSON))) 

oder noch kürzer (vorausgesetzt, in der Tabelle ist mindestens eine Zeile vorhanden)

SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1))) 

Die Auflistung behält die Reihenfolge bei. Falls Sie sich nicht um die Bestellung kümmern und die Erweiterung hstore installiert haben, können Sie noch kürzere

SELECT skeys(hstore(NULL::schema_name.table_name)) 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.