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 cherche le code qui fait ceci avec une requête de SQL. Points bonus supplémentaires pour les métadonnées liées aux colonnes (par exemple, la longueur, le type de données, etc.)
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 la 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 les colonnes, vous pouvez utiliser l'instruction pragma table_info(table_name)
:
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 .
Voici le moyen simple:
.schema <table>
La question est ancienne mais les suivantes n'ont pas encore été mentionnées.
Dans de nombreux cas, un autre moyen pratique consiste à activer les en-têtes en:
sqlite> .headers on
Ensuite,
sqlite> SELECT ... FROM table
affiche un titre indiquant tous les champs sélectionnés (tous si vous avez sélectionné *) en haut de la sortie.
il suffit d'aller dans votre shell sqlite:
$ sqlite3 path/to/db.sqlite3
et puis juste frappé
sqlite> .schema
et vous aurez tout.
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
;
En vous appuyant sur ce qui précède, vous pouvez tout faire en même temps:
sqlite3 yourdb.db ".schema"
Cela vous donnera le code SQL pour créer la table, qui est en réalité une liste des colonnes.
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 à propos de chaque colonne lorsque OP est demandé (en 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 faire en sorte que pragma_table_info
fonctionne dans une requête.
Exécutez cette requête pour voir toutes les métadonnées de la table:
SELECT * sqlite_master WHERE type = 'table'
Je sais, cela 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. Je propose donc quelque chose basé sur PRAGMA, sachant que votre base de données est «principale»
db eval { PRAGMA main.table_info(<your table name>) } TBL { puts $TBL(name) }
Et tableau utiliser 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