Esiste un SQLite equivalente a DESCRIBE [tabella] di MySQL?


443

Sto appena iniziando a imparare SQLite . Sarebbe bello poter vedere i dettagli di un tavolo, come quello di MySQL DESCRIBE [table]. PRAGMA table_info [table]non è abbastanza buono, poiché contiene solo informazioni di base (ad esempio, non mostra se una colonna è un campo di qualche tipo o meno). SQLite ha un modo per farlo?

Risposte:


561

L' utilità della riga di comando di SQLite ha un .schema TABLENAMEcomando che mostra le istruzioni create.


66
Puoi usare ".schema" senza un tavolo e ti mostrerà tutti.
Dan Benamy,

43
Non dimenticare di lasciare il punto e virgola alla fine della dichiarazione
RTF

10
Non è richiesto un punto e virgola
Simon,

40
@Simon un punto e virgola causerà il fallimento silenzioso del comando .
djeikyb

4
@djeikyb. questo non dovrebbe essere considerato un bug?
Makan Tayebi,

292
PRAGMA table_info([tablename]);

19
Questo sembra più equivalente alla descrizione di MySQL che .schema tablenamea me.
tybro0103,

2
Sì. Questo ha funzionato per me. .schema TABLENAME no. Solo .schema, tuttavia, mostra tutte le istruzioni create, ma il risultato di PRAGMA è molto più utile se voglio solo guardare una tabella.
Dev Kanchen,

15
Sembra che dovrebbe essere la risposta accettata poiché funziona tramite query anziché dipendere da un'interfaccia a riga di comando. +1 da me.
Akoi Meexx,

Addendum: l'unica cosa che sto notando è che non genera PRIMARY KEY quando creo una tabella con INTEGER PRIMARY KEY, solo INTEGER.
Akoi Meexx,

3
@AkoiMeexx: Dalla mia domanda originale: " PRAGMA table_info [table]non è abbastanza buono, in quanto contiene solo informazioni di base (ad esempio, non mostra se una colonna è un campo di qualche tipo o meno)."
Matteo,

116

Stai cercando l'SQL utilizzato per generare una tabella? Per questo, è possibile eseguire una query sulla sqlite_mastertabella :

sqlite> CREATE TABLE foo (bar INT, quux TEXT);
sqlite> SELECT * FROM sqlite_master;
table|foo|foo|2|CREATE TABLE foo (bar INT, quux TEXT)
sqlite> SELECT sql FROM sqlite_master WHERE name = 'foo';
CREATE TABLE foo (bar INT, quux TEXT)

C'è qualche differenza tra questo e .schema foo?
Matteo,

15
@Matthew: .schemapuò essere utilizzato solo da una riga di comando; i comandi precedenti possono essere eseguiti come query attraverso una libreria (Python, C #, ecc.).
Mark Rushakoff, il

@MarkRushakoff Ma il risultato è lo stesso?
DVB

2
+1 "SELEZIONA * DA sqlite_master" funziona con gli strumenti di sviluppo di Chrome durante il debug di WebSql
contactmatt

52

Per vedere tutte le tabelle:

.tables

Per vedere una tabella particolare:

.schema [tablename]

6

Per evitare che le persone vengano fuorviate da alcuni dei commenti alle altre risposte:

  1. Se .schemao query from sqlite_masternon dà alcun output, indica un inesistente tablename, ad esempio, questo può anche essere causato da un ;punto e virgola alla fine per .schema, .tables, ... O semplicemente perché la tabella in realtà non esiste. Ciò .schemanon funziona è molto improbabile e quindi una segnalazione di bug dovrebbe essere presentata al progetto sqlite.

... .schema può essere utilizzato solo da una riga di comando; i comandi precedenti> possono essere eseguiti come query attraverso una libreria (Python, C #, ecc.). - Mark Rushakoff, il 25 luglio 10 alle 21:09

  1. 'può essere utilizzato solo da una riga di comando' può indurre in errore le persone. Quasi ogni linguaggio di programmazione (probabilmente ogni?) Può chiamare altri programmi / comandi. Pertanto il commento citato è sfortunato in quanto chiamare un altro programma, in questo caso sqlite, ha maggiori probabilità di essere supportato rispetto al fatto che la lingua fornisce un wrapper/ libraryper ogni programma (che non solo è soggetto a incompletezza per la natura stessa delle masse di programmi là fuori , ma è anche contro-azione single-source principle, complicando maintenance, promuovendo il caos dei dati nel mondo).

1
Chiunque scriva un programma per recuperare dati da qualsiasi database SQL dovrebbe utilizzare i driver SQL appropriati disponibili per il proprio linguaggio di programmazione per accedere al database ed eseguire query su di esso. Questo è il modo appropriato per accedere a un database. Non consiglierei mai di hackerare un programma da riga di comando progettato per fornire query ad hoc. Il tuo suggerimento è profondamente sbagliato. Un programma da riga di comando per query ad hoc NON È Certamente il punto di accesso più appropriato per il codice del programma per eseguire query su un database. L'uso dei driver SQL NON Certamente "complica la manutenzione" - è la migliore pratica.
Medlock Perlman,

Sono d'accordo che non è male, è simile alle biblioteche. Ecco perché le distribuzioni Linux | BSD spediscono i gestori di pacchetti. E perché esiste 0install multipiattaforma PM. Il mio punto era solo quello di chiarire che non tutti i programmi necessitano di wrapper. Non ha senso ogni volta. In questo caso (gestione DB) ovviamente non è una cattiva idea usare un wrapper.
Radagast,

1

Se stai usando uno strumento grafico. Ti mostra lo schema proprio accanto al nome della tabella. Nel caso di DB Browser Per Sqlite , fare clic per aprire il database (angolo in alto a destra), navigare e aprire il database, vedrai le informazioni popolate nella tabella come di seguito.

inserisci qui la descrizione dell'immagine

fai clic con il tasto destro sul record / table_name, fai clic su copia istruzione create e il gioco è fatto.

Spero che abbia aiutato un principiante che non ha lavorato con la riga di comando.

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.