Jak wyświetlić tabele w pliku bazy danych SQLite, który został otwarty za pomocą ATTACH?


1197

Jakiego SQL można użyć do wyświetlenia tabel i wierszy w tych tabelach w pliku bazy danych SQLite - po dołączeniu go za pomocą ATTACHpolecenia w narzędziu wiersza poleceń SQLite 3 ?


1
spróbuj tego, masz pełne informacje o stołach http://www.sqlite.org/pragma.html#schema
Piyush

2
Poniższy jest przydatnym GUI dla sqlite, jeśli jesteś zainteresowany: sqlitestudio.pl Daje ci dostęp do przeglądania szczegółów baz danych, tabel, bardzo szybko i ma również ładny edytor zapytań ...
James Oravec

17
.tablesdla tabel i .schema ?TABLE?schematu konkretnej tabeli.
H6.

.table 'bank_%'lub .table '%_empl'też poprawna składnia zapytania o prefiksy / sufiksy!
gavenkoa

Odpowiedzi:


576

Funkcje „ .tablesi .schemapomocnik” nie sprawdzają DODATKOWYCH baz danych: po prostu sprawdzają SQLITE_MASTERtabelę w poszukiwaniu „głównej” bazy danych. W związku z tym, jeśli użyłeś

ATTACH some_file.db AS my_db;

musisz to zrobić

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

Zwróć uwagę, że tabele tymczasowe nie są wyświetlane z .tables: musisz podać sqlite_temp_master:

SELECT name FROM sqlite_temp_master WHERE type='table';

121
"SELECT name FROM sqlite_master WHERE type='table'"Działa tylko dla mnie
vladkras,

3
WYBIERZ nazwę od my_db.sqlite_master GDZIE type = 'table'; To nie działa na mnie (na załączonym DB) i zgłasza błąd jako: Nie ma takiego stołu istnieje „my_db.sqlite_master”
Kanika

co masz na myśli przez tymczasowe stoły? Czy są jakieś, kiedy właśnie otworzyłem plik db SQLite?
Ewoks

Tabele tymczasowe to tabele utworzone za pomocą CREATE TEMPORARY TABLEpoleceń SQL. Ich zawartość jest usuwana po zamknięciu bieżącego połączenia z bazą danych i nigdy nie są zapisywane w pliku bazy danych.
Anthony Williams

1
W trybie komend sqlite3 i uruchom ATTACH "some_file.db" AS my_db; To działało!
John_J

1272

Istnieje kilka kroków, aby zobaczyć tabele w bazie danych SQLite:

  1. Wyświetl tabele w bazie danych:

    .tables
  2. Wymień wygląd tabeli:

    .schema tablename
  3. Wydrukuj cały stół:

    SELECT * FROM tablename;
  4. Wyświetl wszystkie dostępne polecenia zachęty SQLite:

    .help

45
.tablei .tablesoba są dozwolone. W tym .taprzypadku działałoby również, ponieważ sqlite3 zaakceptuje każde polecenie, które jest jednoznaczne. Nazwa polecenia według pomocy to w rzeczywistości „.tabele” (jeśli ktoś nadal zwraca uwagę).
dbn

29
(To powinna być zaakceptowana odpowiedź, jest to najbardziej praktyczny sposób robienia rzeczy).
dbn

6
.tablesnie wyświetli tabel, jeśli otworzy się jedna baza danych, ATTACH '<path>' AS <name>;ale odpowiedź Lasse się spełni. odkąd OP wspomniał o ZAŁĄCZENIU, uważam, że miał rację, nie przyjmując tej odpowiedzi. edycja: właśnie zauważyłem, że Anthony i inni poniżej również to zauważyli.
antiplex

2
@dbw: Niepotrzebnie. Rozważ, że robisz opakowanie DB, które może korzystać z SQLite lub MySql (moja sprawa). Użycie większej liczby poleceń zgodnych z SQL ułatwiłoby przeniesienie opakowania w innych językach niż w przypadku użycia poleceń specyficznych dla dostawcy DB.
Valentin Heinitz

„... sqlite3 zaakceptuje każde polecenie, które jest jednoznaczne ...” Niestety czasami akceptuje także polecenia niejednoznaczne. Na przykład „.s” jest interpretowane jako „.show”, nawet jeśli „.schema”, „.separator” lub „.stats” również byłyby możliwe. A gdy nie akceptuje niejednoznacznego polecenia, nie podaje możliwości

442

Wygląda na to, że musisz przejść przez tabelę sqlite_master w następujący sposób:

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

A następnie ręcznie przejrzyj każdą tabelę za pomocą SELECTlub podobnego, aby spojrzeć na rzędy.

Wydaje się, że polecenia .DUMPi w .SCHEMAogóle nie widzą bazy danych.


120
Nie jest to coś łatwego do odczytania lub zapamiętania do użytku w przyszłości; wbudowane .tablespolecenie jest bardziej intuicyjne

24
@Gryllida: pomimo tego można go używać z dowolnego interfejsu API języka SQL, ponieważ jest to prawidłowy kod SQL. Wbudowane polecenia mogą nie być obsługiwane wszędzie.
Valentin Heinitz,

2
@DoktorJ Czy .tableszmodyfikowano wyświetlanie tabel z dołączonej bazy danych?
Lasse V. Karlsen

4
W tej bazie danych tak, ale to pytanie dotyczyło wyświetlenia tabel w dołączonej bazie danych. Czy .tablespolecenie zostało zmodyfikowane, aby również je pokazać?
Lasse V. Karlsen

4
Doh! Czytanie ze zrozumieniem nie powiodło się ... Jakoś nie udało mi się złapać odniesienia ATTACH ... dwa razy> _ <
Doktor J

162

Aby wyświetlić wszystkie tabele, użyj

SELECT name FROM sqlite_master WHERE type = "table"

Aby pokazać wszystkie wiersze, myślę, że możesz iterować wszystkie tabele i po prostu wykonać SELECT * na każdym z nich. Ale może szukasz DUMP?


16
Dzięki za jedyną odpowiedź, która naprawdę dotyczyła pytania ... „Jaki SQL”, a nie jakiej komendy można użyć… dzięki!
Brad Parks

Ponadto drukuje jedną nazwę tabeli w wierszu, podczas gdy .tables drukuje wiele kolumn nazw tabel (irytujące / nieprzydatne).
Shane

68

Służy .helpdo sprawdzania dostępności poleceń.

.table

To polecenie wyświetla wszystkie tabele w bieżącej bazie danych.


Dziwne, musi być poprawne, ale nie działa, gdy go używam
Jürgen K.

42

W wierszu poleceń SQLite dostępne jest do tego polecenie:

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

Który konwertuje na następujący 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

Aby wyświetlić listę tabel, możesz także:

SELECT name FROM sqlite_master
WHERE type='table';

Więc ... cur.execute(""" SELECT name FROM sqlite_master WHERE type='table';""")czy nie? To nie działa dla mnie, ale nie jestem pewien, gdzie ten kod ma zostać uruchomiony.
jbuddy_13


24

Używam tego zapytania, aby je uzyskać:

SELECT name FROM sqlite_master WHERE type='table'

I do użycia w iOS:

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

16

Zgodnie z dokumentacją odpowiednikiem MySQL SHOW TABLES;jest:

Polecenie „.tables” jest podobne do ustawiania trybu listy, a następnie wykonania następującego zapytania:

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;

Jeśli jednak sprawdzasz, czy istnieje jedna tabela (lub chcesz uzyskać szczegółowe informacje), zobacz odpowiedź @LuizGeron .


15

Od najnowszych wersji SQLite 3 możesz wydawać:

.fullschema

aby zobaczyć wszystkie swoje instrukcje tworzenia.


Wersja SQLite 3.7.13 2012-07-17 17:46:21 Wpisz „.help”, aby uzyskać instrukcje Wprowadź instrukcje SQL zakończone znakiem „;” sqlite> .fullschema Błąd: nieznane polecenie lub nieprawidłowe argumenty: „fullschema”. Wpisz „.help”, aby uzyskać pomoc
Mona Jalal

2
Używasz wersji z 2012 roku
pieprz

12

Najprostszym sposobem na to jest otwarcie bazy danych bezpośrednio i użycie .dumppolecenia, a nie dołączenie go po wywołaniu narzędzia powłoki SQLite 3.

Więc ... (załóżmy, że wiersz polecenia systemu operacyjnego to $) zamiast $sqlite3:

sqlite3> ATTACH database.sqlite as "attached"

Z poziomu wiersza poleceń systemu operacyjnego otwórz bazę danych bezpośrednio:

$sqlite3 database.sqlite
sqlite3> .dump

10

Za pomocą a union allpołącz wszystkie tabele w jedną listę.

select name
from sqlite_master 
where type='table'

union all 

select name 
from sqlite_temp_master 
where type='table'

9

Posługiwać się:

import sqlite3

TABLE_LIST_QUERY = "SELECT * FROM sqlite_master where type='table'"

7

Ponieważ nikt nie wspomniał o oficjalnej referencji SQLite, myślę, że przydatne może być odwołanie się do niej pod tym nagłówkiem:

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

Możesz manipulować bazą danych za pomocą poleceń opisanych w tym łączu. Poza tym, jeśli używasz systemu operacyjnego Windows i nie wiesz, gdzie znajduje się powłoka poleceń, to jest na stronie SQLite:

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

Po pobraniu kliknij plik sqlite3.exe, aby zainicjować powłokę poleceń SQLite . Po zainicjowaniu domyślnie ta sesja SQLite używa bazy danych w pamięci, a nie pliku na dysku, więc wszystkie zmiany zostaną utracone po zakończeniu sesji. Aby użyć pliku dysku trwałego jako bazy danych, wprowadź polecenie „.open ex1.db” natychmiast po uruchomieniu okna terminala.

Powyższy przykład powoduje, że plik bazy danych o nazwie „ex1.db” jest otwierany i używany oraz tworzony, jeśli wcześniej nie istniał. Możesz użyć pełnej nazwy ścieżki, aby upewnić się, że plik znajduje się w katalogu, w którym go uważasz. Użyj ukośników jako znaku separatora katalogu. Innymi słowy użyj „c: /work/ex1.db”, a nie „c: \ work \ ex1.db”.

Aby zobaczyć wszystkie tabele w bazie danych, którą wcześniej wybrałeś, wpisz polecenie .tables zgodnie z powyższym linkiem.

Jeśli pracujesz w systemie Windows, myślę, że przydatne może być przeniesienie tego pliku sqlite.exe do tego samego folderu z innymi plikami Python. W ten sposób plik Python zapisuje, a powłoka SQLite czyta z plików .db w tej samej ścieżce.


5

Komenda „.schema” wyświetli listę dostępnych tabel i ich wierszy, pokazując instrukcję użytą do utworzenia tych tabel:

sqlite> utwórz table_a (id int, a int, b int);
sqlite> .schema table_a
UTWÓRZ TABELĘ table_a (id int, a int, b int);

1

.da, aby zobaczyć wszystkie bazy danych - jedną o nazwie „ main

tabele tej bazy danych są widoczne przez

WYBIERZ odrębną nazwę tbl_ od zamówienia sqlite_master o 1;

Załączone bazy danych wymagają prefiksów wybranych przez AS w instrukcji ATTACH, np. Aa (, bb, cc ...), aby:

WYBIERZ odrębną nazwę pliku tbl od aa.sqlite_master zamówienie o 1;

Zauważ, że tutaj również masz widoki. Aby je wykluczyć, dodaj where type = „table” przed „order”

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.