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