db = sqlite.connect("test.sqlite")
res = db.execute("select * from table")
Avec l'itération, j'obtiens des listes correspondant aux lignes.
for row in res:
print row
Je peux obtenir le nom des colonnes
col_name_list = [tuple[0] for tuple in res.description]
Mais y a-t-il une fonction ou un paramètre pour obtenir des dictionnaires au lieu d'une liste?
{'col1': 'value', 'col2': 'value'}
ou je dois faire moi-même?
python
sql
sqlite
dictionary
dataformat
Meloun
la source
la source
Réponses:
Vous pouvez utiliser row_factory , comme dans l'exemple de la documentation:
ou suivez les conseils donnés juste après cet exemple dans la documentation:
la source
SELECT 1 AS "dog[cat]"
lecursor
n'aura pas la description correcte pour créer un dict.connection.row_factory = sqlite3.Row
et j'ai essayéconnection.row_factory = dict_factory
comme indiqué, maiscur.fetchall()
me donne toujours une liste de tuples - une idée pourquoi cela ne fonctionne pas?collections.namedtuple
. Quand j'utilise,cur.fetchmany()
j'obtiens des entrées comme<sqlite3.Row object at 0x...>
.Je pensais répondre à cette question même si la réponse est en partie mentionnée dans les réponses d'Adam Schmideg et d'Alex Martelli. Pour que d'autres comme moi qui ont la même question, trouvent la réponse facilement.
la source
fetchall()
Semble actuellement renvoyer dessqlite3.Row
objets. Cependant ceux - ci peuvent être convertis en un dictionnaire en utilisant simplementdict()
:result = [dict(row) for row in c.fetchall()]
.Même en utilisant la classe sqlite3.Row, vous ne pouvez toujours pas utiliser le formatage de chaîne sous la forme de:
Afin de surmonter cela, j'utilise une fonction d'assistance qui prend la ligne et la convertit en dictionnaire. Je ne l'utilise que lorsque l'objet dictionnaire est préférable à l'objet Row (par exemple pour des choses comme le formatage de chaîne où l'objet Row ne prend pas également en charge nativement l'API de dictionnaire). Mais utilisez l'objet Row toutes les autres fois.
la source
print "%(id)i - %(name)s: %(value)s" % dict(row)
Après vous être connecté à SQLite:
con = sqlite3.connect(.....)
il suffit de lancer:Voila!
la source
À partir de la PEP 249 :
Alors oui, faites-le vous-même.
la source
Version plus courte:
la source
Le plus rapide sur mes tests:
contre:
Tu décides :)
la source
Comme mentionné par la réponse de @ gandalf, il faut utiliser
conn.row_factory = sqlite3.Row
, mais les résultats ne sont pas directement des dictionnaires. Il faut ajouter un "cast" supplémentairedict
dans la dernière boucle:la source
Similaire aux solutions mentionnées précédemment, mais les plus compactes:
la source
db.row_factory = sqlite3.Row
n'a pas fonctionné pour moi (car cela a abouti à une erreur de type JSON)Je pense que vous étiez sur la bonne voie. Gardons cela très simple et complétons ce que vous essayiez de faire:
L'inconvénient est que
.fetchall()
, ce qui est un meurtre sur votre consommation de mémoire , si votre table est très grande. Mais pour les applications triviales ne traitant que quelques milliers de lignes de texte et de colonnes numériques, cette approche simple est suffisante.Pour les choses sérieuses, vous devriez vous pencher sur les usines en ligne, comme proposé dans de nombreuses autres réponses.
la source
Ou vous pouvez convertir les sqlite3.Rows en dictionnaire comme suit. Cela donnera un dictionnaire avec une liste pour chaque ligne.
la source
Une alternative générique, en utilisant seulement trois lignes
Mais si votre requête ne renvoie rien, cela entraînera une erreur. Dans ce cas...
ou
la source
Le résultat est certainement vrai, mais je ne connais pas le meilleur.
la source
Les dictionnaires en python fournissent un accès arbitraire à leurs éléments. Donc, tout dictionnaire avec des "noms" bien qu'il puisse être informatif d'une part (c'est-à-dire quels sont les noms de champs) "désordonne" les champs, ce qui pourrait être indésirable.
La meilleure approche consiste à obtenir les noms dans une liste séparée, puis à les combiner vous-même avec les résultats, si nécessaire.
Rappelez-vous également que les noms, dans toutes les approches, sont les noms que vous avez fournis dans la requête, et non les noms de la base de données. L'exception est la
SELECT * FROM
Si votre seul souci est d'obtenir les résultats à l'aide d'un dictionnaire, utilisez définitivement le
conn.row_factory = sqlite3.Row
(déjà indiqué dans une autre réponse).la source