Как составить список таблиц в файле базы данных SQLite, который был открыт с помощью ATTACH?

1197

Какой SQL можно использовать для перечисления таблиц и строк в этих таблицах в файле базы данных SQLite - после того, как я прикрепил его с помощью ATTACHкоманды в средстве командной строки SQLite 3 ?

IZB
источник
1
попробуйте этот, у вас есть полная информация о таблицах http://www.sqlite.org/pragma.html#schema
Piyush
2
Ниже приведен полезный графический интерфейс для sqlite, если вы заинтересованы: sqlitestudio.pl Дает вам доступ к просмотру деталей баз данных, таблиц, очень быстро и имеет хороший редактор запросов ...
Джеймс Оравец
17
.tablesдля таблиц и .schema ?TABLE?для схемы конкретной таблицы.
Н6.
.table 'bank_%'или .table '%_empl'также правильный синтаксис для запроса префиксов / суффиксов!
gavenkoa

Ответы:

576

Функции .tables, и .schema"вспомогательные" не смотрят в базы данных ATTACH: они просто запрашивают у 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
что ты имел ввиду под временными таблицами? Есть ли когда-нибудь, когда я только что открыл файл базы данных SQLite?
Ewoks
Временные таблицы - это таблицы, созданные с помощью 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" (если кто-то все еще обращает внимание).
13
29
(Это должен быть принятый ответ, это самый простой способ сделать что-то).
13
6
.tablesне будет отображать таблицы, если одна открытая база данных будет проходить, ATTACH '<path>' AS <name>;но ответ lasse сделает. Поскольку ОП упомянул ПРИЛОЖЕНИЕ, я считаю, что он был прав, что не принял этот ответ. редактировать: только что заметил, что Энтони и другие ниже также указали на это.
антиплекс
2
@dbw: не обязательно. Представьте, что вы делаете обертку БД, способную использовать SQLite или MySql (мой случай). Использование большего количества SQL-совместимых команд упростит перенос переноса на другие языки, чем если бы вы использовали команды, специфичные для поставщика БД.
Валентин Хайниц
«... 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
Doh! Ошибка чтения ... Мне как-то не удалось поймать ссылку ATTACH ... дважды> _ <
Doktor J
162

Чтобы показать все таблицы, используйте

SELECT name FROM sqlite_master WHERE type = "table"

Чтобы показать все строки, я думаю, что вы можете перебрать все таблицы и просто выполнить SELECT * для каждой из них. Но, может быть, DUMP - это то, что вам нужно?

Кристиан Давен
источник
16
Спасибо за единственный ответ, который действительно ответил на вопрос ... "Какой SQL", а не какую команду можно использовать ... спасибо!
Брэд Паркс
Кроме того, это печатает одно имя таблицы на строку, в то время как .tables печатает несколько столбцов имен таблицы (раздражает / не полезно).
Шейн
68

Используйте .helpдля проверки доступных команд.

.table

Эта команда покажет все таблицы в вашей текущей базе данных.

Antony.H
источник
Странно, это должно быть правильно, но не работает, когда я его использую
Юрген К.
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
32

Попробуйте PRAGMA table_info(table-name);
http://www.sqlite.org/pragma.html#schema

Луис Жерон
источник
2
Это, наверное, лучший способ сделать это.
Аликс Аксель
7
Это работает, только если вы знаете имя таблицы. Вы не можете использовать это, чтобы получить список имен таблиц.
Эрик W
24

Я использую этот запрос, чтобы получить его:

SELECT name FROM sqlite_master WHERE type='table'

И использовать в iOS:

NSString *aStrQuery=[NSString stringWithFormat:@"SELECT name FROM sqlite_master WHERE type='table'"];
GameLoading
источник
16

Согласно документации , эквивалент MySQLs 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» для помощи
Мона Джалал
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'
openwonk
источник
9

Использование:

import sqlite3

TABLE_LIST_QUERY = "SELECT * FROM sqlite_master where type='table'"
Mrityunjay Singh
источник
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 по тому же пути.

oiyio
источник
5

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

sqlite> create table_a (id int, a 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'

Клаас-Z4us-V
источник