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.)
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:
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 .
select * from
?
Oto prosty sposób:
.schema <table>
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.
LIMIT 5
. Nie zapomnij ;
o końcu.
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
;
ORDER BY
na tableName, p.cid
.
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_info
do pracy w zapytaniu.
Uruchom to zapytanie, aby wyświetlić wszystkie metadane tabeli:
SELECT * FROM sqlite_master WHERE type = 'table'
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.
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