Як я можу отримати список стовпців у таблиці для бази даних SQLite?


102

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

Відповіді:


134

Те, що ви шукаєте, називається словником даних. У 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
— Nag Raj

2
@Nag, я вважаю, що SQLite повинен просто ставитися до цих команд як до звичайного SQL, обробляти їх відповідно і повертати вам набір результатів.
— Брайан Кайл

не sqlite замість цього має якийсь ярлик ярлика select * from ?
— jiggunjer

Використовуючи select * з таблиці, коли ви не знаєте, скільки записів у таблиці може бути результатом мільйонних записів та потребуєте часу та ресурсів. Вам слід додати "ліміт 1" або щось подібне.
— Гай Дафні


25

Питання старе, але наступне ще не було згадано.

Ще одним зручним способом у багатьох випадках є включення заголовків за допомогою:

sqlite> .headers on

Тоді,

sqlite> SELECT ... FROM table

відобразиться заголовок із усіма вибраними полями (усі, якщо ви ВИБІРАТИ *) у верхній частині виводу.


Я думаю, правильно, що справжньою проблемою було те, що sqlite3 не забезпечує заголовок запиту за замовчуванням, то це рішення, яке ми всі шукали . Якщо ваш стіл занадто довгий, щоб його відображали на терміналі, просто додайте, наприклад LIMIT 5. Не забудьте ;в кінці.
— fralau

16

просто перейдіть у свою оболонку sqlite:

$ sqlite3 path/to/db.sqlite3

а потім просто вдарити

sqlite> .schema

і ти все отримаєш.


1
Питання шукає запит SQL.
— Еріка

13

Ось оператор 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

7

Це запит, у якому перераховані всі таблиці з їх стовпцями, і всі метадані, які я міг отримати про кожен стовпець у міру прохання ОП (як бонусні бали).

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.