SQLite veritabanı için tablodaki sütunların listesini nasıl alabilirim?


104

Bir tablodaki sütunların bir listesini almak istiyorum. Veritabanı, SQLite'ın en son sürümüdür (3.6, inanıyorum). Bunu bir SQL sorgusu ile yapan bir kod arıyorum. Sütunlarla ilgili meta veriler için ekstra bonus puanlar (örneğin uzunluk, veri türü, vb.)

Yanıtlar:


137

Aradığınız şeye veri sözlüğü denir. Sqlite'de sqlite_master table (veya view?) Sorgulanarak tüm tabloların bir listesi bulunabilir.

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)

Sütun bilgilerini almak için şu pragma table_info(table_name)ifadeyi kullanabilirsiniz :

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

Pragma ifadeleri hakkında daha fazla bilgi için belgelere bakın .


5
Harika! Şimdi bu, komut satırı dışından nasıl yapılır? Bu, kendi C programımdan nasıl yapılır?
Aaron Bratcher

Objective-c
Nag Raj'da

2
@Nag, SQLite'ın bu komutları sıradan SQL olarak ele alması, ona göre işlemesi ve size bir sonuç kümesi döndürmesi gerektiğini düşünüyorum.
Bryan Kyle

sqlite yerine nokta kısayolu yok select * from mu?
jiggunjer

Tablodan seç * i kullanarak, tablodaki ne kadar kaydın milyon kayıtlarının sonucu olabileceğini bilmediğinizde ve zaman ve kaynaklar alırsanız. "Limit 1" veya buna benzer bir şey eklemelisiniz.
Guy Dafny


25

Soru eski ama aşağıdakilerden henüz bahsedilmedi.

Çoğu durumda başka bir uygun yol, başlıkları şu şekilde açmaktır:

sqlite> .headers on

Sonra,

sqlite> SELECT ... FROM table

çıktının üstünde tüm seçili alanları (SEÇİNİZ * ise tümü) gösteren bir başlık görüntüler.


Benim tahminim doğru, asıl sorun sqlite3'ün varsayılan olarak bir sorgunun başlığını sağlamamasıydı, o zaman hepimizin aradığı çözüm budur . Tablonuz terminalinizde görüntülenemeyecek kadar uzunsa, örneğin ekleyin LIMIT 5. ;Sonunda unutma .
fralau

16

sadece sqlite kabuğunuza gidin:

$ sqlite3 path/to/db.sqlite3

ve sonra vur

sqlite> .schema

ve her şeyi alacaksın.


1
Soru bir SQL sorgusu arıyor.
Erica

14

Geçerli veritabanındaki tüm tabloları ve sütunları listeleyen bir SELECT ifadesi:

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
;

Teşekkürler! Olarak değiştirirseniz şemaya göre sipariş ORDER BYverebilirsiniz tableName, p.cid.
mrm

8

Bu, tüm tabloları sütunlarıyla ve OP'nin talep ettiği her sütun hakkında alabildiğim tüm meta verileri (bonus puan olarak) listeleyen bir sorgudur.

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

Bana pragma_table_infobir sorguda nasıl çalışılacağını gösterdiği için @David Garoutte'ye teşekkürler .

Tüm tablo meta verilerini görmek için bu sorguyu çalıştırın:

SELECT * FROM sqlite_master WHERE type = 'table'

1

Yukarıdakilere dayanarak, hepsini aynı anda yapabilirsiniz:

sqlite3 yourdb.db ".schema"

Bu size, etkin bir şekilde sütunların bir listesi olan tabloyu oluşturmak için SQL verecektir.


0

Biliyorum, uzun zaman oldu ama asla geç olmadı… TCL'ye tercüman olarak benzer bir soru sormuştum ve birkaç arama yaptıktan sonra benim için iyi bir şey bulamadım. Bu yüzden, DB'nizin "ana" olduğunu bilerek PRAGMA'ya dayalı bir şey öneriyorum

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

Ve dizi bir liste elde etmek için kullanılır

set col_list {}
db eval { PRAGMA main.table_info(<your table name>) } TBL { lappend col_list $TBL(name) }
puts $col_list
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.