web-dev-qa-db-fra.com

Existe-t-il un moyen d’obtenir une liste de noms de colonnes dans sqlite?

Je veux obtenir une liste de noms de colonnes d'une table dans une base de données. En utilisant pragma, je reçois une liste de n-uplets contenant de nombreuses informations inutiles. Est-il possible d'obtenir uniquement les noms de colonnes? Donc, je pourrais me retrouver avec quelque chose comme ça:

[Column1, Column2, Column3, Column4]

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'index car cet index est utilisé dans une grande partie de mon code.

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

Merci

42
Denman

Vous pouvez utiliser sqlite3 et pep-249

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

curseur.description est la description des colonnes

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

Sinon, vous pouvez utiliser une liste de compréhension:

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

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')
# instead of 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 (rangée ['votre_nom_colonne'])

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

25
flokk

Autant que je sache, Sqlite ne prend pas en charge INFORMATION_SCHEMA. Au lieu de cela, 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 utilisez regex pour les scinder en un format

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
11
wdavo

Moyen rapide et interactif de voir les noms de colonnes

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

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

Sortie 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, moyen rapide d'accéder et de les imprimer.

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

Sortie quelque chose comme ceci:

Date
Object-Name
Object-Count
7
Joseph True

En supposant que vous connaissiez le nom de la table et que vous souhaitiez utiliser les noms des colonnes de données, vous pourrez utiliser le code répertorié pour le faire de manière simple et élégante à mon goût: 

import sqlite3

def get_col_names():
#this works beautifully given that you know the table name
    conn = sqlite3.connect("t.db")
    c = conn.cursor()
    c.execute("select * from tablename")
    return [member[0] for member in c.description]
5
thebeancounter

J'utilise ceci:

import sqlite3

    db = sqlite3.connect('~/foo.sqlite')
    dbc = db.cursor()
    dbc.execute("PRAGMA table_info('bar')"
    ciao = dbc.fetchall()

    HeaderList=[]
    for i in ciao:
        counter=0
        for a in i:
            counter+=1
            if( counter==2):
                HeaderList.append(a)

print(HeaderList)
2
Luca Di Sabatino

J'aime la réponse de @thebeancounter, mais je préfère paramétrer les inconnues, le seul problème étant une vulnérabilité aux exploits du nom de la table. Si vous êtes sûr que tout va bien, cela fonctionne:

def get_col_names(cursor, tablename):
    """Get column names of a table, given its name and a cursor
       (or connection) to the database.
    """
    reader=cursor.execute("SELECT * FROM {}".format(tablename))
    return [x[0] for x in reader.description] 

Si c'est un problème, vous pouvez ajouter du code pour nettoyer le nom du fichier.

1
4dummies

Vous pouvez obtenir une liste de noms de colonnes en lançant:

SELECT name FROM PRAGMA_TABLE_INFO('your_table');
name      
tbl_name  
rootpage  
sql

Vous pouvez vérifier si une certaine colonne existe en lançant:

SELECT 1 FROM PRAGMA_TABLE_INFO('your_table') WHERE name='sql';
1

Référence:

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

0
user1461607