2010-12-02 19 views

cevap

6

Tamamen aşağıdaki sorgu ile postgres kullanarak bir tablo tanımlayabilir:

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

bu Tith sütun adları ve veri türü alacaktır.

O -E seçenekle

$ psql -E 

Sonra basit \d mytable irade çıktı üretmesi tablosunu tanımlamak için Postgres'e tarafından kullanılan sorguları kullanarak psql'in istemcisi başlatmak da mümkündür. Her psql komutları için çalışır.

+0

Mükemmel cevap! Yine de başka bir soruna rastladım: http://stackoverflow.com/questions/4336465/using-query-to-set-the-column-type-in-postgresql – David

+2

Bu regex eşleşmesine ihtiyacınız olduğunu düşünmüyorum, ' c.relname ~ '^ (TABLENAME) $' ',' c.relname = 'TABLENAME' öğesine eşdeğerdir. Yine de güzel cevap. –

+0

@mu Haklısınız, ama bunu regex desteği ile bir şeyden kopyalayıp yapıştırdığımı düşünüyorum :) –

10

bir sütun türünü almak için PostgreSQL bir daha basit yolu yoktur.

SELECT pg_typeof(col)::text FROM tbl LIMIT 1 

Tabiki tablonun en az bir satırı olmalı. Ve sadece temel türünü tür değiştiriciler (varsa) olmadan elde edersiniz. Buna ihtiyacınız varsa aşağıdaki alternatifi kullanın.
Fonksiyonu sabitler için de kullanabilirsiniz. manual on pg_typeof().

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; 

manuel format_type() ve object identifier typesregclass gibi tarih: sütunların tam listesini ve kendi türü sırayla almak için Sistem kataloğu pg_attribute sorgulamak kullanabilirsiniz tablo boş (veya herhangi biri) için

.

+0

"format_type (atttypid, atttypmod)" ifadesini bir süre daha görebilirsiniz, çünkü bu bilgiler information_schema.columns ile aynı gibi görünüyor. udt_name (ya da benzer ve bu benim durumum için mükemmel tamam). Teşekkür ederim :). – Dolfa

İlgili konular