21 votes

Python : les indices de tuple doivent être des entiers, et non des chaînes, lors de la sélection dans une table mysql

J'ai la méthode suivante qui sélectionne tous les ids de la table et les ajoute à une liste et retourne cette liste. Mais lorsque j'exécute ce code, je finis par obtenir l'erreur "tuple indicies must be integers...". J'ai joint l'erreur et l'impression avec ma méthode :

def questionIds(con):
    print 'getting all the question ids'
    cur = con.cursor()
    qIds = []
    getQuestionId = "SELECT question_id from questions_new"
    try:
        cur.execute(getQuestionId)
        for row in cur.fetchall():
            print 'printing row'
            print row
            qIds.append(str(row['question_id']))
    except Exception, e:
        traceback.print_exc()
    return qIds

Imprimer ce que fait ma méthode :

Database version : 5.5.10 
getting all the question ids
printing row
(u'20090225230048AAnhStI',)
Traceback (most recent call last):
  File "YahooAnswerScraper.py", line 76, in questionIds
    qIds.append(str(row['question_id'][0]))
TypeError: tuple indices must be integers, not str

25voto

jjm Points 1883

La bibliothèque python standard mysql renvoie des tuples à partir de cursor.execute. Pour obtenir le champ question_id, vous devez utiliser row[0] no row['question_id'] . Les champs sortent dans le même ordre qu'ils apparaissent dans l'instruction select.

Une façon décente d'extraire des champs multiples est quelque chose comme

for row in cursor.execute("select question_id, foo, bar from questions"):
    question_id, foo, bar = row

8voto

Rafa Points 1099

Il existe plusieurs types de curseurs dans le module MySQLdb. Le curseur par défaut retourne les données dans un tuple de tuples. Lorsque nous utilisons un curseur de dictionnaire, les données sont envoyées sous la forme de dictionnaires Python. De cette façon, nous pouvons nous référer aux données par le nom de leur colonne. Source :

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

6voto

BrunoB Points 337

Je sais que la question est ancienne, mais j'ai trouvé une autre façon de procéder qui, à mon avis, est meilleure que la solution acceptée. Je vais donc la laisser ici au cas où quelqu'un en aurait besoin.

Lors de la création du curseur, vous pouvez utiliser

cur = connection.cursor(dictionary=True);

qui vous permettra de faire exactement ce que vous voulez sans aucune modification supplémentaire.

rows = cur.fetchall()
for row in rows:
    print "%s %s %s" % (row["Id"], row["Name"], row["Price"])

2voto

DienBell Points 172

Que vous pouvez voir ici : Entrez la description du lien ici Je pense que c'est ce que vous voulez.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sqlite3 as lite

con = lite.connect('test.db')    

with con:

    con.row_factory = lite.Row # its key

    cur = con.cursor() 
    cur.execute("SELECT * FROM Cars")

    rows = cur.fetchall()

    for row in rows:
        print "%s %s %s" % (row["Id"], row["Name"], row["Price"])

2voto

Vishal Gediya Points 167

Pour extraire des données de la base de données, utilisez le curseur du dictionnaire.

import psycopg2
import psycopg2.extras
con = psycopg2.connect(database="test", user="test", password="test", host="localhost", port="5432")
if con != None:
    print "Connection Established..!\n"
else:
    print "Database Connection Failed..!\n"

cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)

cur.execute("SELECT * FROM emp")
rows = cur.fetchall()
for row in rows:
    print "%s %s %s" % (row["id"],row["name"],row["address"])

print "\nRecords Display Successfully"
con.commit()
con.close()

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