Come posso ottenere l'elenco di una colonna in una tabella per un database SQLite?


102

Sto cercando di recuperare un elenco di colonne in una tabella. Il database è l'ultima versione di SQLite (3.6, credo). Sto cercando un codice che lo faccia con una query SQL. Punti bonus extra per i metadati relativi alle colonne (es. Lunghezza, tipo di dati, ecc ...)

Risposte:


134

Quello che stai cercando si chiama dizionario dei dati. In sqlite è possibile trovare un elenco di tutte le tabelle interrogando sqlite_master table (o view?)

sqlite> create table people (first_name varchar, last_name varchar, email_address varchar);
sqlite> select * from sqlite_master;
table|people|people|2|CREATE TABLE people (first_name varchar, last_name varchar, email_address varchar)

Per ottenere le informazioni sulla colonna puoi utilizzare l' pragma table_info(table_name)istruzione:

sqlite> pragma table_info(people);
0|first_name|varchar|0||0
1|last_name|varchar|0||0
2|email_address|varchar|0||0

Per ulteriori informazioni sulle istruzioni pragma, vedere la documentazione .


5
Grande! Ora come si fa dall'esterno della riga di comando? Come si fa dall'interno del mio programma C?
Aaron Bratcher,

come posso implementare lo stesso come sopra in Objective-c
Nag Raj

2
@Nag, penserei che SQLite dovrebbe trattare questi comandi come un normale SQL, elaborarli di conseguenza e restituirti un set di risultati.
Bryan Kyle

sqlite non ha qualche scorciatoia a punti invece di select * from ?
jiggunjer

Usando seleziona * dalla tabella, quando non sai quanti record nella tabella potrebbero avere il risultato di milioni di record e richiedere tempo e risorse. Dovresti aggiungere "limite 1" o qualcosa di simile.
Guy Dafny,

55

Ecco il modo semplice:

.schema <table>

4
Questa dovrebbe essere davvero la risposta.
Ehtesh Choudhury

19
@EhteshChoudhury no, non dovrebbe, la domanda richiede una query SQL e questa non è una.
jazzpi

25

La domanda è vecchia ma quanto segue non è stato ancora menzionato.

Un altro modo conveniente in molti casi è attivare le intestazioni:

sqlite> .headers on

Poi,

sqlite> SELECT ... FROM table

mostrerà un titolo che mostra tutti i campi selezionati (tutti se SELEZIONA *) nella parte superiore dell'output.


Immagino sia corretto che il problema effettivo fosse che sqlite3 non fornisce l'intestazione di una query per impostazione predefinita, quindi questa è la soluzione che tutti stavamo cercando . Se la tua tabella è troppo lunga per essere visualizzata sul tuo terminale, aggiungi, ad es LIMIT 5. Non dimenticare il ;alla fine.
fralau

16

basta andare nella tua shell sqlite:

$ sqlite3 path/to/db.sqlite3

e poi basta premere

sqlite> .schema

e otterrai tutto.


1
La domanda sta cercando una query SQL.
Erica

13

Ecco un'istruzione SELECT che elenca tutte le tabelle e le colonne nel database corrente:

SELECT m.name as tableName, 
       p.name as columnName
FROM sqlite_master m
left outer join pragma_table_info((m.name)) p
     on m.name <> p.name
order by tableName, columnName
;

Grazie! Puoi ordinare per schema se cambi ORDER BYin tableName, p.cid.
signor

7

Questa è una query che elenca tutte le tabelle con le loro colonne e tutti i metadati che potrei ottenere su ciascuna colonna come richiesto dall'OP (come punti bonus).

SELECT
  m.name AS table_name, 
  p.cid AS col_id,
  p.name AS col_name,
  p.type AS col_type,
  p.pk AS col_is_pk,
  p.dflt_value AS col_default_val,
  p.[notnull] AS col_is_not_null
FROM sqlite_master m
LEFT OUTER JOIN pragma_table_info((m.name)) p
  ON m.name <> p.name
WHERE m.type = 'table'
ORDER BY table_name, col_id

Grazie a @David Garoutte per avermi mostrato come pragma_table_infolavorare in una query.

Esegui questa query per vedere tutti i metadati della tabella:

SELECT * FROM sqlite_master WHERE type = 'table'

1

Basandosi su quanto sopra, puoi fare tutto in una volta:

sqlite3 yourdb.db ".schema"

Questo ti darà l'SQL per creare la tabella, che è effettivamente un elenco delle colonne.


0

Lo so, è passato tanto tempo ma non è mai troppo tardi… Ho avuto una domanda simile con TCL come interprete e dopo diverse ricerche non ho trovato niente di buono per me. Quindi propongo qualcosa basato su PRAGMA, sapendo che il tuo DB è "principale"

db eval { PRAGMA main.table_info(<your table name>) } TBL { puts $TBL(name) }

E l'uso dell'array per ottenere un elenco

set col_list {}
db eval { PRAGMA main.table_info(<your table name>) } TBL { lappend col_list $TBL(name) }
puts $col_list
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.