Як перелічити таблиці у файлі бази даних SQLite, який був відкритий за допомогою ATTACH?


1197

Який SQL можна використовувати для переліку таблиць та рядків у цих таблицях у файлі бази даних SQLite - як тільки я додаю його ATTACHкомандою на інструменті командного рядка SQLite 3 ?


1
спробуйте цю, ви отримали повну інформацію про таблиці http://www.sqlite.org/pragma.html#schema
Піюш

2
Далі є корисним графічним інтерфейсом для sqlite, якщо вас цікавить: sqlitestudio.pl Надає доступ для перегляду деталей баз даних, таблиць, дуже швидко, а також має чудовий редактор запитів ...
James Oravec

17
.tablesдля таблиць та .schema ?TABLE?для схеми конкретної таблиці.
Н6.

.table 'bank_%'а .table '%_empl'також дійсний синтаксис для запитуючих префіксів / суфіксів!
gavenkoa

Відповіді:


576

Функції .tablesта .schema"помічники" не заглядають у бази даних ATTACHed: вони просто запитують SQLITE_MASTERтаблицю щодо "основної" бази даних. Отже, якщо ви використовували

ATTACH some_file.db AS my_db;

тоді вам потрібно зробити

SELECT name FROM my_db.sqlite_master WHERE type='table';

Зауважте, що тимчасові таблиці не відображаються .tablesні з одним: ви повинні вказати sqlite_temp_masterдля цього:

SELECT name FROM sqlite_temp_master WHERE type='table';

121
Тільки "SELECT name FROM sqlite_master WHERE type='table'"для мене працює
vladkras

3
ВИБРАТИ ім'я від my_db.sqlite_master WHERE type = 'table'; це не працює для мене (для доданого БД), і він видає помилку, оскільки: немає такої таблиці "my_db.sqlite_master"
kanika

що ви мали на увазі під тимчасовими таблицями? Чи є такі, коли я щойно відкрив db-файл SQLite?
Евокс

Тимчасові таблиці - це ті, створені за CREATE TEMPORARY TABLEдопомогою команд SQL. Їх вміст скидається, коли поточне з'єднання з базою даних закрите, і вони ніколи не зберігаються у файл бази даних.
Ентоні Вільямс

1
У командному режимі sqlite3 та запустіть ATTACH "some_file.db" AS my_db; Це працювало!
John_J

1272

Для перегляду таблиць у базі даних SQLite є кілька кроків:

  1. Перерахуйте таблиці у вашій базі даних:

    .tables
  2. Перелічіть, як виглядає таблиця:

    .schema tablename
  3. Роздрукуйте всю таблицю:

    SELECT * FROM tablename;
  4. Перерахуйте всі доступні команди підказок SQLite:

    .help

45
.tableі .tablesвони дозволені. З цього питання також .taбуде працювати, оскільки sqlite3 прийме будь-яку команду, яка є однозначною. Назва команди відповідно до довідки справді ".tables" (якщо хтось ще звертає увагу).
дбн

29
(Це має бути прийнята відповідь, це найважливіший спосіб робити речі).
дбн

6
.tablesне відображатиме таблиці, якщо одна відкрита база даних (ів) через, ATTACH '<path>' AS <name>;але відповідь "lasse" зробить. оскільки ОП згадувало НАСТУПНЕННЯ, я вважаю, що він мав рацію, не приймаючи цієї відповіді. редагувати: щойно помітили, що Антоній та інші нижче також вказали на це.
антиплекс

2
@dbw: Не обов’язково. Подумайте, що ви використовуєте обгортку БД, здатну використовувати SQLite або MySql (мій випадок). Використання більшої кількості команд, сумісних з SQL, полегшить перенесення загорнутого на інші мови, тоді як ви використовуєте команди, визначені DB-постачальниками.
Валентин Хайніц

"... sqlite3 прийме будь-яку команду, яка є однозначною ..." На жаль, іноді вона також приймає неоднозначні команди. Наприклад, ".s" інтерпретується як ".show", навіть якщо ".schema", ".separator" або ".stats" також були б можливостями. І коли він не приймає неоднозначну команду, він не перераховує можливості.

442

Здається, вам потрібно пройти таблицю sqlite_master , наприклад:

SELECT * FROM dbname.sqlite_master WHERE type='table';

А потім вручну пройдіться через кожну таблицю з SELECTподібною або подібною для перегляду рядків.

Команди .DUMPі, .SCHEMAяк видається, взагалі не бачать базу даних.


120
Не щось легко читати чи запам'ятовувати для використання у майбутньому; вбудована .tablesкоманда більш інтуїтивно зрозуміла

24
@Gryllida: незважаючи на це, він може бути використаний з будь-якого SQL-API, оскільки він перевіряє SQL. Вбудовані команди можуть не підтримуватися скрізь.
Валентин Хайніц

2
@DoktorJ Були .tablesмодифіковані для відображення таблиць із доданої бази даних?
Лассе В. Карлсен

4
У цій базі даних так, але це питання стосувалося показу таблиць у доданій базі даних. Чи .tablesбула модифікована команда, щоб показати їх також?
Лассе В. Карлсен

4
До! Читання розуміння не вдається ... Мені якось вдалося не зловити посилання ATTACH ... двічі> _ <
Doktor J

162

Щоб показати всі таблиці, використовуйте

SELECT name FROM sqlite_master WHERE type = "table"

Щоб показати всі рядки, я думаю, ви можете переглядати всі таблиці і просто робити SELECT * на кожній. Але, можливо, DUMP - це те, що ви хочете?


16
Дякую за єдину відповідь, яка справді вирішила питання ... "Що таке SQL", а не яку команду можна використовувати ... дякую!
Бред Паркс

Крім того, це друкує одну назву таблиці на рядок, тоді як .tables друкує кілька стовпців імен таблиць (дратує / не корисно).
Шейн

68

Використовуйте .helpдля перевірки наявних команд.

.table

Ця команда відображала б усі таблиці в поточній базі даних.


Як не дивно, воно повинно бути правильним, але не працює, коли я його використовую
Юрген К.

42

Для цього в командному рядку SQLite доступна команда:

.tables ?PATTERN?      List names of tables matching a LIKE pattern

Який перетворюється на наступний SQL:

SELECT name FROM sqlite_master
WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'
UNION ALL
SELECT name FROM sqlite_temp_master
WHERE type IN ('table','view')
ORDER BY 1

36

Для переліку таблиць ви також можете зробити:

SELECT name FROM sqlite_master
WHERE type='table';

Отже ... cur.execute(""" SELECT name FROM sqlite_master WHERE type='table';""")чи ні? Це не працює для мене, але я не впевнений, де цей код повинен працювати.
jbuddy_13


24

Я використовую цей запит, щоб отримати його:

SELECT name FROM sqlite_master WHERE type='table'

І використовувати в iOS:

NSString *aStrQuery=[NSString stringWithFormat:@"SELECT name FROM sqlite_master WHERE type='table'"];

16

Згідно з документацією , еквівалент MySQL SHOW TABLES;:

Команда ".tables" подібна до режиму встановлення списку і виконує наступний запит:

SELECT name FROM sqlite_master
  WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'
UNION ALL
SELECT name FROM sqlite_temp_master
  WHERE type IN ('table','view')
ORDER BY 1;

Однак якщо ви перевіряєте, чи існує одна таблиця (або щоб отримати її деталі), див. Відповідь @LuizGeron .


15

З останніми версіями SQLite 3 можна видавати:

.fullschema

щоб побачити всі ваші заяви про створення.


Версія SQLite 3.7.13 2012-07-17 17:46:21 Введіть ".help" для вказівок Введіть оператори SQL, що закінчуються знаком ";" Помилка sqlite> .fullschema: невідома команда або недійсні аргументи: "fullschema". Введіть ".help" за допомогою
Mona Jalal

2
Ви використовуєте версію з 2012 року
перець

12

Найпростіший спосіб зробити це - відкрити базу даних безпосередньо та використовувати .dumpкоманду, а не приєднувати її після виклику інструменту оболонки SQLite 3.

Отже ... (припустимо, що в командному рядку операційної системи ОС $) замість $sqlite3:

sqlite3> ATTACH database.sqlite as "attached"

У командному рядку ОС відкрийте базу даних безпосередньо:

$sqlite3 database.sqlite
sqlite3> .dump

10

Через a union allоб'єднайте всі таблиці в один список.

select name
from sqlite_master 
where type='table'

union all 

select name 
from sqlite_temp_master 
where type='table'


7

Оскільки ніхто не згадував про офіційну посилання на SQLite, я вважаю, що це може бути корисним для посилання на нього під цим заголовком:

https://www.sqlite.org/cli.html

Ви можете маніпулювати вашою базою даних за допомогою команд, описаних у цьому посиланні. Крім того, якщо ви використовуєте ОС Windows і не знаєте, де знаходиться командна оболонка, тобто на сайті SQLite:

https://www.sqlite.org/download.html

Завантаживши його, натисніть файл sqlite3.exe, щоб ініціалізувати командну оболонку SQLite . Коли вона ініціалізована, за замовчуванням цей сеанс SQLite використовує базу даних в пам'яті, а не файл на диску, і тому всі зміни будуть втрачені при закінченні сеансу. Щоб використовувати стійкий файл диска як базу даних, введіть команду ".open ex1.db" відразу після запуску вікна терміналу.

Наведений вище приклад змушує відкривати та використовувати файл бази даних з назвою "ex1.db" та створювати його, якщо він раніше не існує. Можливо, ви хочете використовувати повне ім'я шляху, щоб переконатися, що файл знаходиться в каталозі, на який ви вважаєте, що він знаходиться. Іншими словами, використовуйте "c: /work/ex1.db", а не "c: \ work \ ex1.db".

Щоб побачити всі таблиці в попередньо вибраній базі даних, введіть команду .tables, як сказано у вищенаведеному посиланні.

Якщо ви працюєте в Windows, я думаю, що може бути корисним перемістити цей файл sqlite.exe в одну папку з іншими файлами Python. Таким чином, файл Python записує в файл, а оболонка SQLite з файлів .db читає той самий шлях.


5

Командос ".schema" перелічить доступні таблиці та їх рядки, показавши вам оператор, який використовується для створення зазначених таблиць:

sqlite> створити table_a (id int, int, b int);
sqlite> .schema table_a
CREATE TABLE table_a (id int, a int, b int);

1

.da, щоб побачити всі бази даних - одну з них називають " основною "

таблиці цієї бази даних можуть бачити

ВИБІРТЕ відмінне tbl_name від sqlite_master порядку на 1;

До вкладених баз даних потрібні префікси, які ви обрали разом із AS у твердженні ATTACH, наприклад, aa (, bb, cc ...), таким чином:

ВИБІРИТЕ відмінне tbl_name від aa.sqlite_master порядку на 1;

Зауважте, що і тут ви отримуєте погляди. Щоб виключити їх, додайте де type = 'table' перед 'order'

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