Jak uzyskać listę kolumn w tabeli dla bazy danych SQLite?


104

Chcę pobrać listę kolumn w tabeli. Baza danych jest najnowszą wersją SQLite (wydaje mi się, że 3.6). Szukam kodu, który robi to za pomocą zapytania SQL. Dodatkowe punkty bonusowe za metadane związane z kolumnami (np. Długość, typ danych itp.)

Odpowiedzi:


137

To, czego szukasz, nazywa się słownikiem danych. W sqlite listę wszystkich tabel można znaleźć, wysyłając zapytanie do tabeli sqlite_master (lub widoku?)

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)

Aby uzyskać informacje o kolumnie, możesz użyć pragma table_info(table_name)wyciągu:

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

Więcej informacji na temat instrukcji pragma można znaleźć w dokumentacji .


5
Wspaniały! Jak to się robi spoza linii poleceń? Jak to się robi z mojego własnego programu C?
Aaron Bratcher

jak mogę wdrożyć to samo, co powyżej w Objective-c
Nag Raj

2
@Nag, myślę, że SQLite powinien po prostu traktować te polecenia jak zwykły SQL, odpowiednio je przetwarzać i zwracać zestaw wyników.
Bryan Kyle

czy sqlite nie ma jakiegoś skrótu z kropką zamiast select * from ?
jiggunjer

Korzystanie z funkcji select * from table, gdy nie wiesz, ile rekordów w tabeli może zawierać miliony rekordów i wymaga czasu i zasobów. Powinieneś dodać „limit 1” lub coś podobnego.
Guy Dafny


25

Pytanie jest stare, ale jeszcze nie wspomniano.

Innym wygodnym sposobem w wielu przypadkach jest włączanie nagłówków przez:

sqlite> .headers on

Następnie,

sqlite> SELECT ... FROM table

wyświetli nagłówek pokazujący wszystkie zaznaczone pola (wszystkie jeśli wybierzesz *) u góry wyniku.


Domyślam się, że prawdziwy problem polegał na tym, że sqlite3 nie dostarcza domyślnie nagłówka zapytania, a więc jest to rozwiązanie, którego wszyscy szukaliśmy . Jeśli Twoja tabela jest zbyt długa, aby wyświetlić ją na terminalu, po prostu dodaj np LIMIT 5. Nie zapomnij ;o końcu.
fralau

16

po prostu wejdź do swojej powłoki sqlite:

$ sqlite3 path/to/db.sqlite3

a potem po prostu uderz

sqlite> .schema

a dostaniesz wszystko.


1
Pytanie dotyczy zapytania SQL.
Erica

14

Oto instrukcja SELECT, która zawiera listę wszystkich tabel i kolumn w bieżącej bazie danych:

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
;

Dzięki! Możesz zamówić według schematu, jeśli zmienisz ORDER BYna tableName, p.cid.
pan

8

To jest zapytanie, które wyświetla wszystkie tabele z ich kolumnami i wszystkie metadane, które mogłem uzyskać o każdej kolumnie zgodnie z żądaniem OP (jako punkty bonusowe).

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

Dziękuję @David Garoutte za pokazanie mi, jak zabrać się pragma_table_infodo pracy w zapytaniu.

Uruchom to zapytanie, aby wyświetlić wszystkie metadane tabeli:

SELECT * FROM sqlite_master WHERE type = 'table'

1

Opierając się na powyższym, możesz zrobić to wszystko naraz:

sqlite3 yourdb.db ".schema"

To da ci kod SQL do utworzenia tabeli, która jest faktycznie listą kolumn.


0

Wiem, minęło dużo czasu, ale nigdy nie jest za późno… Miałem podobne pytanie z TCL jako tłumaczem i po kilku poszukiwaniach nie znalazłem dla mnie nic dobrego. Proponuję więc coś opartego na PRAGMIE, wiedząc, że Twoja baza danych jest „główna”

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

I tablica do uzyskania listy

set col_list {}
db eval { PRAGMA main.table_info(<your table name>) } TBL { lappend col_list $TBL(name) }
puts $col_list
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.