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

Quale SQL può essere usato per elencare le tabelle e le righe all’interno di quelle tabelle in un file di database SQLite – una volta che l’ho collegato con il comando ATTACH sullo strumento da riga di comando di SQLite 3?

Le .tables .schema e .schema “helper” non esaminano i database ATTACHed: interrogano solo la tabella SQLITE_MASTER per il database “principale”. 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 .tables : devi elencare sqlite_temp_master per quello:

 SELECT name FROM sqlite_temp_master WHERE type='table'; 

Ci sono alcuni passaggi per vedere le tabelle in un database SQLite:

  1. Elenca le tabelle nel tuo database:

     .tables 
  2. Elenca come appare la tabella:

     .schema tablename 
  3. Stampa l’intera tabella:

     SELECT * FROM tablename; 
  4. Elenca tutti i comandi di richiesta SQLite disponibili:

     .help 

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

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

E poi scorrere manualmente ciascuna tabella con una SELECT o simile per guardare le righe.

I comandi .DUMP e .SCHEMA non sembrano affatto vedere il database.

Per mostrare tutte le tabelle, utilizzare

 SELECT name FROM sqlite_master WHERE type = "table" 

Per mostrare tutte le righe, suppongo che tu possa scorrere tutte le tabelle e fare semplicemente un SELECT * su ciascuna di esse. Ma forse un DUMP è quello che cerchi?

Utilizzare. .help per controllare i comandi disponibili.

 .table 

Questo comando mostrerebbe tutte le tabelle sotto il tuo attuale database.

C’è un comando disponibile per questo sulla riga di comando di SQLite:

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

Che converte in SQL seguente:

 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 

Per elencare le tabelle puoi anche fare:

 SELECT name FROM sqlite_master WHERE type='table'; 

Prova PRAGMA table_info(table-name);
http://www.sqlite.org/pragma.html#schema

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

Il comando “.tables” è simile alla modalità elenco delle impostazioni, quindi esegue la 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 stai verificando se esiste una sola tabella (o per ottenere i suoi dettagli), vedi la risposta @LuizGeron .

A partire dalle ultime versioni di SQLite 3 puoi rilasciare:

 .fullschema 

per vedere tutte le tue dichiarazioni create.

Io 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'"]; 

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

Quindi … (supponiamo che il prompt della riga di comando del sistema operativo sia $) anziché $sqlite3 :

 sqlite3> ATTACH database.sqlite as "attached" 

Dalla riga di comando del SO, apri direttamente il database:

 $sqlite3 database.sqlite sqlite3> .dump 

Uso:

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

Tramite un union all , combinare tutte le tabelle in un’unica lista.

 select name from sqlite_master where type='table' union all select name from sqlite_temp_master where type='table' 

Dal momento che nessuno ha menzionato il riferimento ufficiale di SQLite, penso che potrebbe essere utile fare riferimento ad esso sotto questo titolo:

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

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

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

Dopo averlo scaricato, fai clic sul file sqlite3.exe per inizializzare la shell dei comandi di SQLite . Quando viene inizializzato, per impostazione predefinita questa sessione SQLite utilizza un database in memoria, non un file su disco, quindi tutte le modifiche andranno perse all’uscita dalla sessione. Per utilizzare un file disco persistente come database, immettere il comando “.open ex1.db” immediatamente dopo l’avvio della finestra del terminale.

L’esempio precedente provoca l’apertura e l’utilizzo del file di database denominato “ex1.db” e creato se non esiste in precedenza. Potresti voler utilizzare un percorso completo per assicurarti che il file si trovi nella directory in cui pensi che sia. Usa le barre di avanzamento 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 si dice 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 le letture della shell SQLite dai file .db si trovano nello stesso percorso.

Il comando “.schema” elencherà le tabelle disponibili e le loro righe, mostrando la dichiarazione usata per creare le suddette tabelle:

 sqlite> crea table_a (id int, a int, b int);
 sqlite> .schema table_a
 CREATE TABLE table_a (id int, a int, b int);

.da per vedere tutti i database – uno chiamato ‘ principale

le tabelle di questo database possono essere viste da

SELEZIONA distinto tbl_name dall’ordine sqlite_master di 1;

I database allegati hanno bisogno dei prefissi che hai scelto con AS nella dichiarazione ATTACH ad esempio aa (, bb, cc …) quindi:

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

Si noti che qui si ottengono anche le viste. Per escludere questi aggiungi dove type = ‘table’ prima di ‘order’