Як я можу отримати список стовпців у таблиці для бази даних 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.