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

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 .


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>

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.


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.


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
;

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'

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.