Ich muss den Spaltentyp in PostgreSQL kennen (d. H. varchar(20)
). Ich weiß, dass ich das wahrscheinlich mit \d
etwas in psql finden könnte, aber ich brauche es mit einer Select-Abfrage zu tun.
Ist das in PostgreSQL möglich?Fragen Sie die Schemadetails einer Tabelle in PostgreSQL ab?
Antwort
Sie können vollständig unter Verwendung einer Tabelle Postgres mit der folgenden Abfrage beschreiben.
Es ist auch möglich psql Client mit der -E
Option
$ psql -E
und dann einem einfachen \d mytable
ausgeben wird die Abfragen von Postgres zum Starten der Tabelle zu beschreiben. Es funktioniert für jeden psql beschreiben Befehle.
Ja, schauen Sie sich die information_schema.
SELECT
a.attname as Column,
pg_catalog.format_type(a.atttypid, a.atttypmod) as Datatype
FROM
pg_catalog.pg_attribute a
WHERE
a.attnum > 0
AND NOT a.attisdropped
AND a.attrelid = (
SELECT c.oid
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname ~ '^(TABLENAME)$'
AND pg_catalog.pg_table_is_visible(c.oid)
)
Tith diese Spaltennamen und Datentyp abruft:
Es gibt eine viel einfachere Weg in PostgreSQL, um den Typ einer Spalte zu erhalten.
SELECT pg_typeof(col)::text FROM tbl LIMIT 1
Die Tabelle muss mindestens eine Reihe, natürlich halten. Und Sie erhalten nur den Basistyp ohne Typmodifikatoren (falls vorhanden). Verwenden Sie die Alternative unten, wenn Sie das auch brauchen.
Sie können die Funktion auch für Konstanten verwenden. Die manual on pg_typeof()
.
Für einen leeren (oder jede) Tabelle Sie pg_attribute
den Systemkatalog abfragen können die vollständige Liste der Spalten und deren jeweilige Art, um zu erhalten:
SELECT attnum, attname AS column, format_type(atttypid, atttypmod) AS type
FROM pg_attribute
WHERE attrelid = 'myschema.mytbl'::regclass -- optionally schema-qualified
AND NOT attisdropped
AND attnum > 0
ORDER BY attnum;
Das Handbuch auf format_type()
und auf object identifier types wie regclass
.
Suche nach "format_type (attypid, atttypmod)" für eine Weile, als es scheint, dass das gleiche wie information_schema.columns. udt_name (oder ähnlich und das ist vollkommen in Ordnung für meinen Fall). Vielen Dank :). – Dolfa
Ausgezeichnete Antwort! Ich stieß jedoch auf ein anderes Problem: http://stackoverflow.com/questions/4336465/using-query-to-set-the-column-type-in-postgresql – David
Ich glaube nicht, dass Sie diese Regex-Übereinstimmung brauchen, ' c.relname ~ '^ (TABLENAME) $' 'entspricht" c.relname = 'TABLENAME' ". Schöne Antwort. –
@mu Du hast recht, aber ich denke er hat es einfach kopiert von etwas mit Regex-Unterstützung :) –