Belirtilen bir tablonun tüm sütunlarını nasıl listelerim?


292

Hiçbir bilgim olmayan bir veritabanında kesin bir bilgi parçası arıyorum.

Bu bir üçüncü taraf ürünüdür, bazı soruları cevaplama konusunda yavaşlar ve verilerin bu db'nin içinde olduğunu biliyorum, bu yüzden biraz retro mühendisliği yapmak istiyorum.

Bir tablo verildiğinde, bu tablo için sütunların adlarının bir listesine sahip olmak mümkün müdür?

Örneğin SqlServer'da, bir tabloyu CREATE, tablonun oluşturduğu tüm sütunları metinsel olarak listeleyen, yeniden kullanılabilir bir ifadeye dökmek mümkündür .


DB'ye ne tür erişiminiz var?
dezso

@dezso, ayrı bir makinede, ancak oturum açabilir ve yönetici haklarına sahip psql komut satırını çalıştırabilirim
Stephane Rolland

6
Ben doğru anlamak, peşindesiniz \dt[+] table_nameiçinde psql.
dezso

1
Hayır. \ dt + açıkça sütunların adını göstermiyor. sadece bir "Açıklama" alanı ekler.
Stephane Rolland,

12
ama \ d + tablo adı çalışıyor!
Stephane Rolland,

Yanıtlar:


344

Komut satırından ek olarak \d+ <table_name>zaten buldum, ayrıca kullanabilirsiniz Bilgi Şeması kullanılarak, kolon veri aramak için information_schema.columns:

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

Not: Yukarıdaki örneğe göre, değerlerin tırnak içine alındığından emin olun.


2
Psql'in olarak, kullanmak \x onveya \pset expanded onokumak için böylece daha kolay (yerine tabular) sorgu sonuçları doğrusal hale getirmek ve stackoverflow.com/a/9605093/513397
anishpatel

4
Geçerli sürümlerde ( \d+ public.*9.6'da denendi), publicşemadaki tüm tabloların ve görünümlerin açıklamasını (şema + indeces / fkeys / tetikleyiciler) almak için psql'de yapabilirsiniz . Her işlem tarafından yapılan DB değişikliklerini takip etmek için işlem öncesi kanca komut dosyasında kullanıyoruz.
Thalis K.

4
Yalnızca sütun adını almak için column_name SELECT
Andrew,

82

Diğer cevaplara ek olarak, satır döndürmeyen bir SELECT ifadesi bile sütun adlarını size ve uygulama koduna maruz bırakacaktır.

select *
from table_name
where false;

İzinler, bu yaklaşımların herhangi biriyle devreye girebilir.


Sanırım bu SQL'i psql komutuna geçirmek istemeniz gerekiyor. Çıktıdaki sürprizlerden kaçınmak için bu durumda --no-psqlrc seçeneğini kullanmanızı öneririm.
JohnMudd

Seçilmesi gereken gizli sütunlar hariç (pg_class.oid gibi)
okutane

71

Bilgi şema yavaş ve emin yoludur: bu standartlaştırılmış ve onu destekleyen diğer veritabanlarına büyük ölçüde taşınabilir. Ve büyük sürümlerde çalışmaya devam edecek.

Bununla birlikte, bilgi şemasındaki görüşler çoğu zaman çoğu zaman sadece ölü yük olan katı standartlaştırılmış bir formatta bir araya gelmek için çoğu zaman sistem kataloglarındaki birçok tabloda yer almaktadır . Bu onları yavaşlatır .
Postgres geliştiricileri umut vaat etmiyorlar, ancak temeller (burada ihtiyaç duyulan gibi) ana sürümler arasında değişmeyecek.

psql(yerel komut satırı arayüzü) elbette hızlı şeridi alır ve kaynağı doğrudan sorgular. psqlParametre ile-E başlarsanız , bunun gibi ters eğik çizgi komutlarının arkasındaki SQL \dgörüntülenir. Veya \set ECHO_HIDDEN onpsql komut satırından. Oradan başlayarak sorunuza bir cevap oluşturabilirsiniz.

Bir tablo verildiğinde, bu tablo için sütunların adlarının bir listesine sahip olmak mümkündür.

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;

Sorgulamadaninformation_schema.columns daha hızlı . Deneyin EXPLAIN ANALYZEkendiniz görün. Tek seferlik bir arama için hala önemli değil. Ancak, birçok kez tekrarlanan bir sorguda / fonksiyonda kullanıldığında fark yaratabilir.

Ayrıca görünürlükte ince farklılıklar var. Detaylı karşılaştırma:


2
Gerçekten size göstermek -Eve insanlara psql sql nasıl edinileceğini göstermek gibi.
Evan Carroll

6

psql PostgreSQL 11+ sürümünde

Eğer bir sorguyu sütun türleri için arıyorsanız, size kullanabilirsiniz 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)

0

Sadece PostgreSQL

Bu biraz hokey ancak mümkün olan en kısa SQL'yi arıyorsanız, bir rakip olabilir:

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

veya daha kısa (tabloda en az bir satır bulunduğunu varsayarak)

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

Liste düzeni korur. Siparişinizi önemsemiyorsanız ve hstoreuzatma yüklü ise, daha da kısa sürede yapabilirsiniz.

SELECT skeys(hstore(NULL::schema_name.table_name))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.