Bagaimana cara mendaftar semua kolom untuk tabel tertentu

293

Saya mencari informasi dalam database yang tidak saya ketahui.

Ini adalah produk pihak ke-3, mereka lambat dalam menjawab beberapa pertanyaan, dan saya tahu datanya ada di dalam db itu, jadi saya ingin melakukan sedikit teknik retro.

Diberikan satu tabel, apakah mungkin untuk memiliki daftar nama-nama kolom untuk tabel ini?

Sebagai contoh di SqlServer, dimungkinkan untuk membuang tabel ke CREATEpernyataan yang dapat digunakan kembali , yang secara tekstual mencantumkan semua kolom yang terdiri dari tabel tersebut.

Stephane Rolland
sumber
Apa jenis akses yang Anda miliki ke DB?
dezso
@dezso, itu pada mesin yang terpisah, tapi saya bisa masuk ke dalamnya, dan meluncurkan baris perintah psql, dengan hak administrator
Stephane Rolland
6
Jika saya mengerti Anda dengan benar, Anda akan \dt[+] table_namemasuk psql.
dezso
1
nggak. \ dt + sepertinya tidak secara eksplisit menampilkan nama kolom. itu hanya menambahkan bidang "Keterangan".
Stephane Rolland
12
tapi \ d + nama tabel berhasil!
Stephane Rolland

Jawaban:

344

Selain baris perintah \d+ <table_name>yang sudah Anda temukan, Anda juga bisa menggunakan Skema Informasi untuk mencari data kolom, menggunakan information_schema.columns:

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

Catatan: Seperti contoh di atas, pastikan nilainya tertutup dalam tanda kutip.

Bhamby
sumber
2
Dalam psql, gunakan \x onatau \pset expanded onuntuk membuat hasil kueri linear (bukan tabular) dan dengan demikian lebih mudah dibaca stackoverflow.com/a/9605093/513397
anishpatel
4
Dalam versi saat ini (mencobanya di 9.6), Anda dapat melakukannya dalam psql \d+ public.*untuk mendapatkan deskripsi (skema + indeces / fkeys / trigger) dari semua tabel dan tampilan di publicskema. Kami menggunakannya dalam skrip kait pra-komit kami untuk melacak git perubahan dalam DB yang dibuat oleh setiap komit.
Thalis K.
4
SELECT nama_kolom untuk mendapatkan hanya nama kolom
Andrew
82

Sebagai pelengkap jawaban lain, bahkan pernyataan SELECT yang tidak mengembalikan baris akan memaparkan nama kolom kepada Anda dan kode aplikasi.

select *
from table_name
where false;

Izin mungkin ikut bermain dengan salah satu dari pendekatan ini.

Mike Sherrill 'Cat Recall'
sumber
Saya kira Anda bermaksud untuk melewatkan SQL ini ke perintah psql. Saya sarankan menggunakan opsi --no-psqlrc dalam kasus itu untuk menghindari kejutan dalam output.
JohnMudd
Kecuali untuk kolom tersembunyi, yang harus ditentukan untuk dipilih (seperti pg_class.oid)
okutane
71

The informasi skema adalah cara lambat dan pasti: itu adalah standar dan sebagian besar portabel untuk database lain yang mendukungnya. Dan itu akan terus bekerja di versi utama.

Namun, pandangan dalam skema informasi sering kali bergabung dalam banyak tabel dari katalog sistem untuk memenuhi format standar yang ketat - banyak di antaranya hanya barang mati sebagian besar. Ini membuat mereka lambat .
Pengembang Postgres tidak membuat janji, tetapi dasar-dasar (seperti apa yang dibutuhkan di sini) tidak akan berubah di berbagai versi utama.

psql(antarmuka baris perintah asli) mengambil jalur cepat, tentu saja, dan menanyakan sumber secara langsung. Jika Anda mulai psqldengan parameter-E , SQL di belakang perintah backslash suka \dditampilkan. Atau \set ECHO_HIDDEN ondari baris perintah psql. Mulai dari sana Anda dapat membangun jawaban untuk pertanyaan Anda.

Diberikan satu tabel, apakah mungkin untuk memiliki daftar nama-nama kolom untuk tabel ini.

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;

Lebih cepat dari permintaaninformation_schema.columns . Coba EXPLAIN ANALYZElihat sendiri. Masih sulit untuk satu kali pencarian. Tetapi mungkin membuat perbedaan jika digunakan dalam kueri / fungsi yang diulang berkali-kali.

Ada juga perbedaan visibilitas yang halus. Perbandingan rinci:

Erwin Brandstetter
sumber
2
Sangat suka bahwa Anda menunjukkan kepada Anda -Edan menunjukkan kepada orang-orang cara mendapatkan sql dari psql.
Evan Carroll
6

psql pada PostgreSQL 11+

Jika Anda sedang mencari jenis kolom pada query, Anda dapat menggunakan 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)
Evan Carroll
sumber
0

Hanya PostgreSQL

Ini agak tipu tetapi bisa menjadi penantang jika Anda mencari SQL sesingkat mungkin:

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

atau bahkan lebih pendek (dengan asumsi setidaknya ada satu baris yang ada di tabel)

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

Daftar mempertahankan pesanan. Jika Anda tidak peduli dengan pesanan dan hstorememasang ekstensi, Anda dapat melakukan lebih pendek

SELECT skeys(hstore(NULL::schema_name.table_name))
oᴉɹǝɥɔ
sumber