Come elencare le tabelle in un file di database SQLite che è stato aperto con ATTACH?


1197

Quale SQL può essere utilizzato per elencare le tabelle e le righe all'interno di tali tabelle in un file di database SQLite , dopo averlo collegato con il ATTACHcomando sullo strumento da riga di comando di SQLite 3 ?


1
prova questo hai informazioni complete sui tavoli http://www.sqlite.org/pragma.html#schema
Piyush

2
La seguente è una GUI utile per sqlite se sei interessato: sqlitestudio.pl Ti dà accesso per visualizzare i dettagli di database, tabelle, molto rapidamente e ha anche un bel editor di query ...
James Oravec

17
.tablesper le tabelle e .schema ?TABLE?per lo schema della tabella specifica.
H6.

.table 'bank_%'o .table '%_empl'anche una sintassi valida per i prefissi / suffissi di query!
gavenkoa,

Risposte:


576

Le funzioni .tables, e .schema"helper" non guardano nei database ATTACHed: si limitano a interrogare la SQLITE_MASTERtabella per il database "main". Di conseguenza, se hai usato

ATTACH some_file.db AS my_db;

allora devi fare

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

Nota che le tabelle temporanee non vengono visualizzate con .tablesnessuno dei due: devi elencare sqlite_temp_masterper quello:

SELECT name FROM sqlite_temp_master WHERE type='table';

121
"SELECT name FROM sqlite_master WHERE type='table'"Funziona solo per me
Vladkras il

3
SELEZIONA nome DA my_db.sqlite_master DOVE tipo = 'tabella'; questo non funziona per me (per il DB allegato) e genera un errore come: non esiste una tabella di questo tipo "my_db.sqlite_master"
kanika

cosa intendevi per tabelle temporanee? Ce ne sono quando ho appena aperto il file db di SQLite?
Ewoks

Le tabelle temporanee sono quelle create con CREATE TEMPORARY TABLEi comandi SQL. Il loro contenuto viene eliminato quando viene chiusa la connessione al database corrente e non vengono mai salvati in un file di database.
Anthony Williams,

1
Sotto la modalità di comando sqlite3 ed esegui ATTACH "some_file.db" AS my_db; Ha funzionato!
John_J il

1272

Esistono alcuni passaggi per visualizzare le tabelle in un database SQLite:

  1. Elencare le tabelle nel database:

    .tables
  2. Elenca come appare la tabella:

    .schema tablename
  3. Stampa l'intero tavolo:

    SELECT * FROM tablename;
  4. Elencare tutti i comandi prompt di SQLite disponibili:

    .help

45
.tablee .tablessono entrambi ammessi. Del .taresto, funzionerebbe anche, dal momento che sqlite3 accetterà qualsiasi comando non ambiguo. Il nome del comando secondo l'aiuto è in effetti ".tables" (se qualcuno sta ancora prestando attenzione).
dbn

29
(Questa dovrebbe essere la risposta accettata, è il modo più sqlite-y di fare le cose).
dbn

6
.tablesnon visualizzerà le tabelle se un database aperto (s) attraverso ATTACH '<path>' AS <name>;ma la risposta di Lasse farà. da quando l'OP ha menzionato ALLEGATO, credo che avesse ragione nel non accettare questa risposta. modifica: ho appena notato che anche Anthony e altri sotto lo hanno sottolineato.
antiplex

2
@dbw: non necessariamente. Considera che stai eseguendo un wrapper DB in grado di utilizzare SQLite o MySql (il mio caso). L'uso di più comandi conformi a SQL semplificherebbe il porting del wrapping in altre lingue se si utilizzassero comandi specifici del fornitore DB.
Valentin Heinitz,

"... sqlite3 accetterà qualsiasi comando che non sia ambiguo ..." Purtroppo a volte accetta anche comandi ambigui. Ad esempio, ".s" viene interpretato come ".show", anche se ".schema", ".separator" o ".stats" sono anch'essi delle possibilità. E quando non accetta un comando ambiguo, non elenca le possibilità

442

Sembra che tu debba passare attraverso la tabella sqlite_master , in questo modo:

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

E poi passa manualmente attraverso ogni tabella con un SELECTo simile per guardare le righe.

I comandi .DUMPe .SCHEMAnon sembrano vedere affatto il database.


120
Non è qualcosa di facile da leggere o ricordare per l'uso in futuro; il .tablescomando

24
@Gryllida: nonostante ciò è utilizzabile da qualsiasi API SQL in quanto è valido SQL. I comandi integrati potrebbero non essere supportati ovunque.
Valentin Heinitz,

2
@DoktorJ Sono .tablesstati modificati per visualizzare le tabelle da un database collegato?
Lasse V. Karlsen,

4
In quel database , sì, ma questa domanda riguardava la visualizzazione delle tabelle in un database che hai allegato. Il .tablescomando è stato modificato per mostrare anche quelli?
Lasse V. Karlsen,

4
Doh! La comprensione della lettura fallisce ... In qualche modo sono riuscito a non cogliere il riferimento ATTACH ... due volte> _ <
Doktor J

162

Per mostrare tutte le tabelle, utilizzare

SELECT name FROM sqlite_master WHERE type = "table"

Per mostrare tutte le righe, immagino che tu possa scorrere tutte le tabelle e fare semplicemente un SELECT * su ognuna di esse. Ma forse un DUMP è ciò che cerchi?


16
Grazie per l'unica risposta che ha davvero risposto alla domanda ... "Che SQL", non quale comando può essere usato ... grazie!
Brad Parks,

Inoltre, questo stampa un nome di tabella per riga, mentre .tables stampa più colonne di nomi di tabelle (fastidiose / non utili).
Shane,

68

Utilizzare .helpper verificare la presenza di comandi disponibili.

.table

Questo comando mostrerebbe tutte le tabelle nel database corrente.


Strano, deve essere corretto, ma non funziona quando lo uso
Jürgen K.

42

È disponibile un comando per questo nella riga di comando di SQLite:

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

Che converte nel seguente 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

Per elencare le tabelle puoi anche fare:

SELECT name FROM sqlite_master
WHERE type='table';

Quindi ... cur.execute(""" SELECT name FROM sqlite_master WHERE type='table';""")o no? Non funziona per me, ma non sono sicuro di dove debba essere eseguito questo codice.
jbuddy_13,


24

Uso questa query per ottenerlo:

SELECT name FROM sqlite_master WHERE type='table'

E da usare in iOS:

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

16

Secondo la documentazione , l'equivalente di MySQL SHOW TABLES;è:

Il comando ".tables" è simile all'impostazione della modalità elenco e quindi all'esecuzione della seguente query:

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;

Tuttavia, se si sta verificando l'esistenza di una singola tabella (o per ottenere i dettagli), vedere la risposta di @LuizGeron .


15

A partire dalle ultime versioni di SQLite 3 è possibile emettere:

.fullschema

per vedere tutte le tue dichiarazioni create.


Versione SQLite 3.7.13 2012-07-17 17:46:21 Immettere ".help" per istruzioni Immettere le istruzioni SQL terminate con un ";" sqlite> .fullschema Errore: comando sconosciuto o argomenti non validi: "fullschema". Inserisci ".help" come aiuto
Mona Jalal,

2
Stai usando una versione del 2012
pepe

12

Il modo più semplice per farlo è aprire direttamente il database e utilizzare il .dumpcomando, anziché collegarlo dopo aver richiamato lo strumento di shell SQLite 3.

Quindi ... (supponiamo che il prompt della riga di comando del sistema operativo sia $) invece di $sqlite3:

sqlite3> ATTACH database.sqlite as "attached"

Dalla riga di comando del sistema operativo, apri direttamente il database:

$sqlite3 database.sqlite
sqlite3> .dump

10

Tramite a union all, combina tutte le tabelle in un elenco.

select name
from sqlite_master 
where type='table'

union all 

select name 
from sqlite_temp_master 
where type='table'

9

Uso:

import sqlite3

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

7

Poiché nessuno ha menzionato il riferimento ufficiale di SQLite, penso che possa essere utile fare riferimento ad esso in questa rubrica:

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

Puoi manipolare il tuo database usando i comandi descritti in questo link. Inoltre, se stai utilizzando il sistema operativo Windows e non sai dove si trova la shell dei comandi, si trova nel sito di SQLite:

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

Dopo averlo scaricato, fare clic sul file sqlite3.exe per inizializzare la shell dei comandi di SQLite . Quando viene inizializzata, per impostazione predefinita questa sessione SQLite utilizza un database in memoria, non un file sul disco, e quindi tutte le modifiche andranno perse quando la sessione viene chiusa. Per utilizzare un file del disco persistente come database, immettere il comando ".open ex1.db" immediatamente dopo l'avvio della finestra del terminale.

L'esempio precedente fa sì che il file di database denominato "ex1.db" venga aperto e utilizzato e creato se non esiste in precedenza. È possibile che si desideri utilizzare un percorso completo per assicurarsi che il file si trovi nella directory in cui si ritiene sia presente. Utilizzare le barre in avanti come carattere separatore di directory. In altre parole, usa "c: /work/ex1.db", non "c: \ work \ ex1.db".

Per vedere tutte le tabelle nel database che hai scelto in precedenza, digita il comando .tables come indicato nel link sopra.

Se lavori in Windows, penso che potrebbe essere utile spostare questo file sqlite.exe nella stessa cartella con gli altri file Python. In questo modo, il file Python scrive e la shell SQLite legge dai file .db si trova nello stesso percorso.


5

Il comando ".schema" elencherà le tabelle disponibili e le relative righe, mostrandoti l'istruzione utilizzata per creare tali tabelle:

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 per vedere tutti i database - uno chiamato ' main '

le tabelle di questo database possono essere visualizzate da

SELEZIONA tbl_name distinto dall'ordine sqlite_master per 1;

I database allegati necessitano di prefissi scelti con AS nell'istruzione ATTACH, ad esempio aa (, bb, cc ...), quindi:

SELEZIONA tbl_name distinto dall'ordine aa.sqlite_master di 1;

Si noti che qui si ottengono anche le viste. Per escluderli, aggiungere dove type = 'table' prima di 'order'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.