103 votes

Y a-t-il un moyen d'obtenir une liste de noms de colonnes dans sqlite?

Je veux obtenir une liste des noms de colonnes d'une table dans une base de données. En utilisant pragma, j'obtiens une liste de tuples avec beaucoup d'informations inutiles. Existe-t-il un moyen d'obtenir uniquement les noms des colonnes? Ainsi, je pourrais obtenir quelque chose comme ceci:

[Colonne1, Colonne2, Colonne3, Colonne4]

La raison pour laquelle j'ai absolument besoin de cette liste est que je veux rechercher un nom de colonne dans la liste et obtenir l'indice car l'indice est utilisé dans beaucoup de mon code.

Existe-t-il un moyen d'obtenir une liste comme celle-ci?

Merci

220voto

smallredstone Points 1786

Vous pouvez utiliser sqlite3 et pep-249

import sqlite3
connection = sqlite3.connect('~/foo.sqlite')
cursor = connection.execute('select * from bar')

cursor.description est la description des colonnes

names = list(map(lambda x: x[0], cursor.description))

Alternativement, vous pourriez utiliser une compréhension de liste :

names = [description[0] for description in cursor.description]

45voto

flokk Points 106

Une alternative à la solution cursor.description de smallredstone pourrait être d'utiliser row.keys() :

import sqlite3

connection = sqlite3.connect('~/foo.sqlite')
connection.row_factory = sqlite3.Row
cursor = connection.execute('select * from bar')
# au lieu de cursor.description:
row = cursor.fetchone()
names = row.keys()

L'inconvénient : cela ne fonctionne que s'il y a au moins une ligne retournée par la requête.

L'avantage : vous pouvez accéder aux colonnes par leur nom (row['your_column_name'])

En savoir plus sur les objets Row dans la documentation python.

19voto

wdavo Points 2614

À ce que je sache, Sqlite ne prend pas en charge INFORMATION_SCHEMA. À la place, il a sqlite_master.

Je ne pense pas que vous puissiez obtenir la liste que vous voulez en une seule commande. Vous pouvez obtenir les informations dont vous avez besoin en utilisant sql ou pragma, puis utiliser regex pour les diviser dans le format dont vous avez besoin

SELECT sql FROM sqlite_master WHERE name='tablename';

vous donne quelque chose comme

CREATE TABLE tablename(
        col1 INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
        col2 NVARCHAR(100) NOT NULL,
        col3 NVARCHAR(100) NOT NULL,
)

Ou en utilisant pragma

PRAGMA table_info(tablename);

vous donne quelque chose comme

0|col1|INTEGER|1||1
1|col2|NVARCHAR(100)|1||0
2|col3|NVARCHAR(100)|1||0

11voto

Joseph True Points 481

Manière rapide et interactive de voir les noms de colonnes

Si vous travaillez de manière interactive en Python et que vous voulez simplement 'voir' rapidement les noms des colonnes, j'ai trouvé que cursor.description fonctionne.

import sqlite3
conn = sqlite3.connect('test-db.db')
cursor = conn.execute('select * from mytable')
cursor.description

Produit quelque chose comme ceci :

(('Date', None, None, None, None, None, None),
('Object-Name', None, None, None, None, None, None),
('Object-Count', None, None, None, None, None, None))

Ou, manière rapide d'y accéder et de les imprimer.

colnames = cursor.description
for row in colnames:
    print row[0]

Produit quelque chose comme ceci :

Date
Object-Name
Object-Count

11voto

user1461607 Points 154

Vous pouvez obtenir une liste des noms de colonnes en exécutant :

SÉLECTIONNEZ nom DE PRAGMA_TABLE_INFO('votre_table');
nom
tbl_name
rootpage
sql

Vous pouvez vérifier si une certaine colonne existe en exécutant :

SÉLECTIONNEZ 1 DE PRAGMA_TABLE_INFO('votre_table') OÙ nom='sql'; 
1

Référence :

https://www.sqlite.org/pragma.html#pragfunc

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X