Bagaimana cara mendapatkan daftar kolom dalam tabel untuk database SQLite?

102

Saya mencari untuk mengambil daftar kolom dalam tabel. Database adalah rilis terbaru dari SQLite (3.6, saya percaya). Saya mencari kode yang melakukan ini dengan kueri SQL. Poin bonus tambahan untuk metadata yang terkait dengan kolom (misalnya panjang, tipe data, dll ...)

AngryHacker
sumber

Jawaban:

134

Apa yang Anda cari disebut kamus data. Di sqlite, daftar semua tabel dapat ditemukan dengan menanyakan tabel sqlite_master (atau view?)

sqlite> create table people (first_name varchar, last_name varchar, email_address varchar);
sqlite> select * from sqlite_master;
table|people|people|2|CREATE TABLE people (first_name varchar, last_name varchar, email_address varchar)

Untuk mendapatkan informasi kolom, Anda dapat menggunakan pragma table_info(table_name)pernyataan:

sqlite> pragma table_info(people);
0|first_name|varchar|0||0
1|last_name|varchar|0||0
2|email_address|varchar|0||0

Untuk informasi lebih lanjut tentang pernyataan pragma, lihat dokumentasi .

Bryan Kyle
sumber
5
Bagus! Sekarang bagaimana ini dilakukan dari luar baris perintah? Bagaimana ini dilakukan dari dalam program C saya sendiri?
Aaron Bratcher
bagaimana saya bisa menerapkan yang sama seperti di atas di Objective-c
Nag Raj
2
@Nag, saya akan berpikir Anda bahwa SQLite seharusnya memperlakukan perintah ini sebagai SQL biasa, memprosesnya sesuai, dan mengembalikan Anda set hasil.
Bryan Kyle
bukankah sqlite memiliki beberapa pintasan titik, bukan select * from ?
jiggunjer
Menggunakan pilih * dari tabel, ketika Anda tidak tahu berapa banyak catatan dalam tabel yang mungkin menghasilkan jutaan catatan dan memakan waktu dan sumber. Anda harus menambahkan "batas 1" atau semacamnya.
Guy Dafny
55

Berikut caranya yang sederhana:

.schema <table>
ifightcrime
sumber
4
Ini harus menjadi jawabannya.
Ehtesh Choudhury
19
@EhteshChoudhury tidak seharusnya, pertanyaan menanyakan kueri SQL dan ini bukan satu.
jazzpi
25

Pertanyaannya sudah lama tetapi yang berikut ini belum disebutkan.

Cara mudah lainnya dalam banyak kasus adalah dengan mengaktifkan header dengan:

sqlite> .headers on

Kemudian,

sqlite> SELECT ... FROM table

akan menampilkan judul yang menunjukkan semua bidang yang dipilih (semua jika Anda PILIH *) di bagian atas keluaran.

penyerbu
sumber
Saya kira benar bahwa masalah sebenarnya adalah bahwa sqlite3 tidak menyediakan header kueri secara default, maka itulah solusi yang kita semua telah cari . Jika tabel Anda terlalu panjang untuk ditampilkan di terminal Anda, tambahkan saja, mis LIMIT 5. Jangan lupa ;di bagian akhir.
fralau
16

cukup masuk ke shell sqlite Anda:

$ sqlite3 path/to/db.sqlite3

dan kemudian tekan saja

sqlite> .schema

dan kamu akan mendapatkan segalanya.

Majd Taby
sumber
1
Pertanyaannya adalah mencari kueri SQL.
Erica
13

Berikut pernyataan SELECT yang mencantumkan semua tabel dan kolom di database saat ini:

SELECT m.name as tableName, 
       p.name as columnName
FROM sqlite_master m
left outer join pragma_table_info((m.name)) p
     on m.name <> p.name
order by tableName, columnName
;
David Garoutte
sumber
Terima kasih! Anda dapat memesan berdasarkan skema jika Anda mengubah ORDER BYke tableName, p.cid.
mrm
7

Ini adalah kueri yang mencantumkan semua tabel dengan kolomnya, dan semua metadata yang bisa saya dapatkan tentang setiap kolom seperti yang diminta OP (sebagai poin bonus).

SELECT
  m.name AS table_name, 
  p.cid AS col_id,
  p.name AS col_name,
  p.type AS col_type,
  p.pk AS col_is_pk,
  p.dflt_value AS col_default_val,
  p.[notnull] AS col_is_not_null
FROM sqlite_master m
LEFT OUTER JOIN pragma_table_info((m.name)) p
  ON m.name <> p.name
WHERE m.type = 'table'
ORDER BY table_name, col_id

Terima kasih kepada @David Garoutte karena telah menunjukkan cara mendapatkannya pragma_table_info bekerja dalam kueri.

Jalankan kueri ini untuk melihat semua tabel metadata:

SELECT * FROM sqlite_master WHERE type = 'table'
lewdev
sumber
1

Berdasarkan hal di atas, Anda dapat melakukan semuanya sekaligus:

sqlite3 yourdb.db ".schema"

Itu akan memberi Anda SQL untuk membuat tabel, yang secara efektif merupakan daftar kolom.

beberapa ide
sumber
0

Saya tahu, sudah lama sekali tetapi tidak pernah ada kata terlambat… Saya memiliki pertanyaan serupa dengan TCL sebagai juru bahasa dan setelah beberapa kali pencarian, tidak ada yang baik untuk saya. Jadi saya mengusulkan sesuatu berdasarkan PRAGMA, mengetahui bahwa DB Anda adalah "utama"

db eval { PRAGMA main.table_info(<your table name>) } TBL { puts $TBL(name) }

Dan array digunakan untuk mendapatkan daftar

set col_list {}
db eval { PRAGMA main.table_info(<your table name>) } TBL { lappend col_list $TBL(name) }
puts $col_list
Choca Croc
sumber