2012-09-07 14 views
16

Ho il seguente metodo che seleziono tutti gli id ​​dalla tabella e li aggiungo a una lista e restituisco quella lista. Ma quando eseguo questo codice, finisco per ottenere gli indovinelli tuple devono essere numeri interi ... errore. Ho allegato l'errore e la stampa fuori con il mio metodo:Python: gli indici tupla devono essere interi, non str quando si seleziona dalla tabella 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 

stampa ciò che il mio metodo fa:

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 

risposta

21

La libreria mysql standard di python restituisce tuple da cursor.execute. Per accedere al campo question_id devi utilizzare row[0], non row['question_id']. I campi escono nello stesso ordine in cui appaiono nell'istruzione select.

un modo decente per estrarre più campi è qualcosa di simile

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

Se si desidera poter estrarre i valori delle colonne per nome di colonna, si consiglia di provare a creare il cursore con MySQLdb.cursors.DictCursor. Vedi http://stackoverflow.com/questions/10195139/how-to-retrieve-sql-result-column-value-using-column-name-in-python –

-1

row è una tupla. Quando fai row['question_id'], stai provando ad accedere ad una tupla usando un indice di stringa che ti dà un errore.

+0

così ho provato la seguente riga [ 'question_id'] [0] ma ancora mi ha dato la stessa risposta –

+0

'row' è una tupla. Le tuple hanno questo aspetto: 't = ('a', 'b', 'c')'. Puoi accedervi utilizzando un indice intero, ad esempio 't [0] = 'a'',' t [1] =' b'', 't [2] = 'c''. Non è possibile accedervi utilizzando una stringa come indice; puoi farlo solo con un 'dict'. – Lanaru

1

potete vedere qui: enter link description here, credo che il suo vostro voglia

#!/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

Ci sono diversi tipi di cursore nel modulo MySQLdb. Il cursore predefinito restituisce i dati in una tupla di tuple. Quando usiamo un cursore dizionario, i dati vengono inviati in una forma di dizionari Python. In questo modo possiamo fare riferimento ai dati in base al loro nome di colonna. 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

Gli indici interi non sono consentiti. Per farlo funzionare è possibile dichiarare il DICT come specificato di seguito:

VarName = {} 

Spero che questo funzioni per voi.

1

per recuperare dati dal database di dizionario utilizzo cursore

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

So che la domanda è vecchio, ma ho trovato un altro modo per farlo che penso che sia meglio che la soluzione accettata. Quindi lo lascerò qui nel caso qualcuno ne avesse bisogno.

Quando si crea il cursore è possibile utilizzare

cur = connection.cursor(dictionary=True); 

che vi permetterà di fare esattamente quello che vuoi, senza ulteriori modifiche.

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

questo non funziona in python 2.6, ma fa in +2.7 – fersarr

Problemi correlati