2012-09-07 12 views
16

Tengo el siguiente método que selecciono todos los identificadores de la tabla y los anexo a una lista y los devuelvo. Pero cuando ejecuto este código termino obteniendo indicios de tuplas que deben ser enteros ... error. He adjuntado el error y la impresión junto con mi método:Python: los índices de tupla deben ser enteros, no str al seleccionar de la tabla mysql

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 

Impresión lo que hace mi método:

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 

Respuesta

21

La biblioteca de Python estándar mysql devuelve tuplas de cursor.execute. Para ir al campo question_id, usaría row[0], no row['question_id']. Los campos salen en el mismo orden en que aparecen en la declaración de selección.

Una buena manera de extraer múltiples campos es algo así como

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

Si desea poder extraer valores de columnas por nombre de columna, puede intentar crear el cursor con MySQLdb.cursors.DictCursor. Ver http://stackoverflow.com/questions/10195139/how-to-retrieve-sql-result-column-value-using-column-name-in-python –

-1

row es una tupla. Cuando hace row['question_id'], está tratando de acceder a una tupla usando un índice de cadena que le da un error.

+0

así que traté de la siguiente fila [ 'question_id'] [0], pero todavía me dio la misma respuesta –

+0

'row' es una tupla. Las tuplas se ven así: 't = ('a', 'b', 'c')'. Accedes a ellos usando un índice entero, es decir, 't [0] = 'a'',' t [1] =' b'', 't [2] = 'c''. No puede acceder a ellos utilizando una cadena como índice; solo puedes hacer eso con un 'dict'. – Lanaru

1

se puede ver aquí: enter link description here, creo que es su falta

#!/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"]) 
7

Hay varios tipos de cursor en el módulo MySQLdb. El cursor predeterminado devuelve los datos en una tupla de tuplas. Cuando usamos un cursor de diccionario, los datos se envían en forma de diccionarios de Python. De esta forma, podemos referirnos a los datos por sus nombres de columna. 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"] 
0

No se permiten índices enteros. Para que funcione, puede declarar el DICT como se especifica a continuación:

VarName = {} 

Espero que esto funcione para usted.

1

para recuperar datos de la base de datos diccionario de uso del cursor

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() 
4

Sé que la pregunta es viejo, pero he encontrado otra manera de hacerlo que yo creo que es mejor que la solución aceptada. Así que lo dejaré aquí por si alguien lo necesita.

Al crear el cursor puede utilizar

cur = connection.cursor(dictionary=True); 

que le permitirá hacer exactamente lo que quiere sin ningún tipo de modificaciones adicionales.

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

esto no funciona en Python 2.6, pero sí en +2.7 – fersarr

Cuestiones relacionadas