web-dev-qa-db-fra.com

Python MySQLDB: obtenir le résultat de fetchall dans une liste

Je voudrais obtenir le résultat de l'opération fetchall dans une liste au lieu de Tuple of Tuple ou Tuple of dictionaries. Par exemple,

cursor = connection.cursor() #Cursor could be a normal cursor or dict cursor
query = "Select id from bs"
cursor.execute(query)
row = cursor.fetchall()

Maintenant, le problème est que la ligne résultante est soit ((123,), (234,)) ou ({'id': 123}, {'id': 234}) Ce que je recherche est (123,234) ou [ 123,234]. Soyez meilleur si je peux économiser sur l'analyse du resulset. Merci d'avance

28
Raunak Agarwal

Et qu'en est-il des listes de compréhension? Si le résultat est ((123,), (234,), (345,)):

>>> row = [item[0] for item in cursor.fetchall()]
>>> row
[123, 234, 345]

Si le résultat est ({'id': 123}, {'id': 234}, {'id': 345}):

>>> row = [item['id'] for item in cursor.fetchall()]
>>> row
[123, 234, 345]
52
César

Je suis sûr qu'après tout ce temps, vous avez résolu ce problème, cependant, pour certaines personnes qui ne savent pas comment obtenir les valeurs d'un curseur en tant que dictionnaire à l'aide de MySQLdb, vous pouvez utiliser cette méthode trouvée ici :

import MySQLdb as mdb

con = mdb.connect('localhost', 'testuser', 'test623', 'testdb')

with con:

    cur = con.cursor(mdb.cursors.DictCursor)
    cur.execute("SELECT * FROM Writers LIMIT 4")

    rows = cur.fetchall()

    for row in rows:
        print row["Id"], row["Name"]
15
onetwopunch

Cet ancien Q apparaît sur Google lors de la recherche de requêtes de base de données aplaties, alors voici d'autres suggestions ...

Considérons un rapide itérateur d'aplatissement de liste .

D'autres réponses utilisent fetchall() qui charge d'abord toutes les lignes en mémoire, puis itère dessus pour créer une nouvelle liste. Cela pourrait être inefficace. Pourrait se combiner avec MySQL soi-disant curseur côté serveur :

# assume mysql on localhost with db test and table bs
import itertools
import MySQLdb
import MySQLdb.cursors

conn = MySQLdb.connect(Host='localhost',db='test', 
          cursorclass=MySQLdb.cursors.SSCursor ) 
cursor = conn.cursor()
# insert a bunch of rows
cursor.executemany('INSERT INTO bs (id) VALUES (%s)',Zip(range(1,10000)) )
conn.commit()
# retrieve and listify
cursor.execute("select id from bs")
list_of_ids = list(itertools.chain.from_iterable(cursor))
len(list_of_ids)
#9999
conn.close()

Mais la question est également étiquetée Django, qui a un Nice aplatisseur de requête à champ unique

class Bs(models.Model):
    id_field = models.IntegerField()

list_of_ids = Bs.objects.values_list('id_field', flat=True)
10
billspat

S'il n'y a qu'un seul champ, je peux l'utiliser pour faire une liste à partir de la base de données:

def getFieldAsList():
    kursor.execute("Select id from bs")
    id_data = kursor.fetchall()
    id_list = []
    for index in range(len(id_data)):
        id_list.append(id_data[index][0])
    return id_list
1
pupil

Faites votre objet curseur de cette manière:

db = MySQLdb.connect("IP", "user", "password", "dbname")

cursor = db.cursor(MySQLdb.cursors.DictCursor)

Ensuite, lorsque vous exécutez cursor.fetchall () sur une requête, un tuple de dictionnaires sera obtenu, que vous pourrez ensuite convertir en liste.

data = cursor.fetchall()

data = list(data)
1
Sahana Joshi