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 ...)

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 .


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>

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.


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.


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
;

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'

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.