Как я могу получить список столбцов в таблице для базы данных SQLite?

104

Я хочу получить список столбцов в таблице. База данных - это последняя версия SQLite (я считаю, 3.6). Я ищу код, который делает это с помощью SQL-запроса. Дополнительные бонусные баллы за метаданные, относящиеся к столбцам (например, длина, тип данных и т. Д.)

Злой Хакер
источник

Ответы:

137

То, что вы ищете, называется словарем данных. В sqlite список всех таблиц можно найти, запросив таблицу sqlite_master (или просмотр?)

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)

Чтобы получить информацию о столбце, вы можете использовать pragma table_info(table_name)оператор:

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

Для получения дополнительной информации о операторах прагмы см. Документацию .

Брайан Кайл
источник
5
Большой! Как это сделать вне командной строки? Как это делается в моей собственной программе на C?
Аарон Братчер,
как я могу реализовать то же самое в Objective-c
Наг Радж
2
@Nag, я бы подумал, что SQLite должен просто обрабатывать эти команды как обычный SQL, обрабатывать их соответствующим образом и возвращать вам набор результатов.
Брайан Кайл
Разве в sqlite нет ярлыка с точкой вместо select * from ?
jiggunjer 02
Использование select * from table, когда вы не знаете, сколько записей в таблице может иметь результат в миллионы записей и потребовать времени и ресурсов. Вы должны добавить «предел 1» или что-то в этом роде.
Guy Dafny
56

Вот простой способ:

.schema <table>
преступление
источник
4
Это действительно должен быть ответ.
Эхтеш Чоудхури,
19
@EhteshChoudhury нет, не следует, вопрос требует SQL-запроса, а это не тот.
jazzpi
25

Вопрос старый, но еще не упоминалось следующее.

Другой удобный способ во многих случаях - включить заголовки:

sqlite> .headers on

Затем,

sqlite> SELECT ... FROM table

отобразит заголовок, показывающий все выбранные поля (все, если вы ВЫБЕРИТЕ *) в верхней части вывода.

inVader
источник
Я считаю правильным, что реальная проблема заключалась в том, что sqlite3 не предоставляет заголовок запроса по умолчанию, тогда это решение, которое мы все искали . Если ваша таблица слишком длинная для отображения на вашем терминале, просто добавьте, например LIMIT 5. Не забывайте ;в конце.
fralau
16

просто войдите в свою оболочку sqlite:

$ sqlite3 path/to/db.sqlite3

а затем просто нажмите

sqlite> .schema

и вы получите все.

Маджд Таби
источник
1
Вопрос ищет SQL-запрос.
Эрика
14

Вот инструкция SELECT, в которой перечислены все таблицы и столбцы в текущей базе данных:

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на tableName, p.cid.
mrm 05
8

Это запрос, в котором перечислены все таблицы с их столбцами и все метаданные, которые я мог получить о каждом столбце по запросу OP (в качестве бонусных баллов).

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

Спасибо @David Garoutte за то, что показал мне, как приступить pragma_table_infoк работе с запросом.

Выполните этот запрос, чтобы увидеть все метаданные таблицы:

SELECT * FROM sqlite_master WHERE type = 'table'
распутник
источник
1

Основываясь на вышеизложенном, вы можете сделать все сразу:

sqlite3 yourdb.db ".schema"

Это даст вам SQL для создания таблицы, которая фактически представляет собой список столбцов.

некоторые идеи
источник
0

Я знаю, это было давно, но никогда не поздно ... У меня был аналогичный вопрос с TCL в качестве интерпретатора, и после нескольких поисков я не нашел ничего подходящего. Поэтому я предлагаю что-то основанное на PRAGMA, зная, что ваша БД «основная»

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

И использовать массив для получения списка

set col_list {}
db eval { PRAGMA main.table_info(<your table name>) } TBL { lappend col_list $TBL(name) }
puts $col_list
Choca Croc
источник