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

1voto

Thomas R Points 444

Étant donné que la question comporte un drapeau python. Je me sens libre de poster une réponse spécifique à python avec pandas:

import sqlite3
import pandas as pd

path_to_db = 'chemin/vers/db'
connect = sqlite3.connect(path_to_db, isolation_level=None)
table = 'nom_table'

column_list = list(pd.read_sql_query(f"SÉLECTIONNER * FROM {table} limit 1", connect).columns)

1voto

itchenfei Points 11
import sqlite3

with sqlite3.connect('statics.db') as cur:
    cur.execute("CREATE TABLE IF NOT EXISTS data(id INT PRIMARY KEY NOT NULL)")
    pragmas = cur.execute("PRAGMA table_info(data);")
    columns = [n for _, n, *_ in pragmas.fetchall()]
    print(columns)

Translation:

import sqlite3

with sqlite3.connect('statics.db') as cur:
    cur.execute("CREATE TABLE IF NOT EXISTS data(id INT PRIMARY KEY NOT NULL)")
    pragmas = cur.execute("PRAGMA table_info(data);")
    columns = [n for _, n, *_ in pragmas.fetchall()]
    print(columns)

0voto

user3342816 Points 483

Un autre moyen d'utiliser pragma:

> table = "foo"
> cur.execute("SELECT group_concat(name, ', ') FROM pragma_table_info(?)", (table,))
> cur.fetchone()
('foo', 'bar', ...,)

0voto

xjcl Points 608

Si vous êtes à l'aise avec l'utilisation de pandas, je recommande d'utiliser pandas.read_sql_query, qui vous renverra un DataFrame complet incluant les noms de colonnes en tant qu'en-tête ; cela se formate également très bien à la sortie standard.

import pandas as pd
import sqlite3

with sqlite3.connect("my_db_file.db") as conn:
    df = pd.read_sql_query("SELECT * FROM foo", conn)
    print(df)  # utilisez df.columns.tolist() pour obtenir uniquement l'en-tête

0voto

Javier Buzzi Points 2107

Un peu tard à la fête, mais voici la solution que j'ai trouvée en m'inspirant de la réponse de @flokk.

import sqlite3

connection = sqlite3.connect('~/foo.sqlite')
connection.row_factory = sqlite3.Row  # cette partie est importante!!!!!
cursor = connection.cursor()

data = [dict(zip(x.keys(), x)) for x in cursor.execute('select * from bar').fetchall()]
print(data)  # [{'col1': 'data1', 'col2': ...}, ...]

Est-ce efficace? Non. Est-ce que ça marche? Oui!

Le problème que j'essayais de résoudre était que je n'avais aucune idée quelles étaient les colonnes de la table, et cela m'a énormément aidé.

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