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
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]
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"]
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)
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
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)