Comment puis-je obtenir la liste des colonnes d'une table pour une base de données SQLite?

103

Je cherche à récupérer une liste de colonnes dans un tableau. La base de données est la dernière version de SQLite (3.6, je crois). Je recherche du code qui fait cela avec une requête SQL. Points bonus supplémentaires pour les métadonnées liées aux colonnes (ex: longueur, type de données, etc ...)

AngryHacker
la source

Réponses:

135

Ce que vous recherchez s'appelle le dictionnaire de données. Dans sqlite, une liste de toutes les tables peut être trouvée en interrogeant la table sqlite_master (ou vue?)

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)

Pour obtenir des informations sur la colonne, vous pouvez utiliser l' pragma table_info(table_name)instruction:

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

Pour plus d'informations sur les instructions pragma, consultez la documentation .

Bryan Kyle
la source
5
Génial! Maintenant, comment cela se fait-il en dehors de la ligne de commande? Comment cela se fait-il depuis mon propre programme C?
Aaron Bratcher le
comment puis-je implémenter la même chose que ci-dessus dans Objective-c
Nag Raj
2
@Nag, je pense que SQLite devrait simplement traiter ces commandes comme du SQL ordinaire, les traiter en conséquence et vous renvoyer un ensemble de résultats.
Bryan Kyle
sqlite n'a-t-il pas un raccourci par point au lieu de select * from ?
jiggunjer
En utilisant select * from table, lorsque vous ne savez pas combien d'enregistrements dans la table peuvent avoir le résultat d'enregistrements de milions et prendre du temps et des ressources. Vous devez ajouter "limite 1" ou quelque chose comme ça.
Guy Dafny
55

Voici le moyen simple:

.schema <table>
ifightcrime
la source
4
Cela devrait vraiment être la réponse.
Ehtesh Choudhury
19
@EhteshChoudhury non ça ne devrait pas, la question demande une requête SQL et ce n'en est pas une.
jazzpi
25

La question est ancienne mais la suivante n'a pas encore été mentionnée.

Dans de nombreux cas, un autre moyen pratique consiste à activer les en-têtes en:

sqlite> .headers on

Ensuite,

sqlite> SELECT ... FROM table

affichera un titre montrant tous les champs sélectionnés (tous si vous sélectionnez *) en haut de la sortie.

envahisseur
la source
Je suppose que le problème réel était que sqlite3 ne fournit pas l'en-tête d'une requête par défaut, alors c'est la solution que nous recherchons tous . Si votre table est trop longue pour être affichée sur votre terminal, ajoutez simplement, par exemple LIMIT 5. N'oubliez pas ;la fin.
fralau
16

allez simplement dans votre shell sqlite:

$ sqlite3 path/to/db.sqlite3

et puis viens de frapper

sqlite> .schema

et vous obtiendrez tout.

Majd Taby
la source
1
La question recherche une requête SQL.
Erica
14

Voici une instruction SELECT qui répertorie toutes les tables et colonnes de la base de données actuelle:

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
;
David Garoutte
la source
Merci! Vous pouvez classer par schéma si vous changez votre ORDER BYen tableName, p.cid.
mrm
8

Il s'agit d'une requête qui répertorie toutes les tables avec leurs colonnes, et toutes les métadonnées que je pourrais obtenir sur chaque colonne comme OP demandé (en tant que points 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

Merci à @David Garoutte de m'avoir montré comment me mettre pragma_table_infoau travail dans une requête.

Exécutez cette requête pour voir toutes les métadonnées de la table:

SELECT * FROM sqlite_master WHERE type = 'table'
Lewdev
la source
1

En vous basant sur ce qui précède, vous pouvez tout faire en même temps:

sqlite3 yourdb.db ".schema"

Cela vous donnera le SQL pour créer la table, qui est en fait une liste des colonnes.

Quelques idées
la source
0

Je sais, ça fait longtemps mais il n'est jamais trop tard… J'ai eu une question similaire avec TCL comme interprète et après plusieurs recherches, je n'ai rien trouvé de bon pour moi. Je propose donc quelque chose basé sur PRAGMA, sachant que votre DB est «principale»

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

Et le tableau utilise pour obtenir une liste

set col_list {}
db eval { PRAGMA main.table_info(<your table name>) } TBL { lappend col_list $TBL(name) }
puts $col_list
Choca Croc
la source