2012-09-07 32 views
16

Tôi có phương pháp sau đây mà tôi chọn tất cả các id từ bảng và thêm chúng vào danh sách và trả về danh sách đó. Nhưng khi thực thi mã này, tôi sẽ nhận được các chỉ báo tuple phải là số nguyên ... lỗi. Tôi có kèm theo lỗi và in ra cùng với phương pháp của tôi:Python: chỉ số tuple phải là số nguyên, không str khi chọn từ bảng 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 

In ấn gì phương pháp của tôi không:

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 

Trả lời

21

Thư viện mysql chuẩn python trả về bộ dữ liệu từ cursor.execute. Để đến trường question_id, bạn sẽ sử dụng row[0], không phải row['question_id']. Các trường xuất hiện theo cùng thứ tự mà chúng xuất hiện trong câu lệnh chọn.

Một cách đàng hoàng để trích xuất nhiều lĩnh vực là một cái gì đó giống như

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

Nếu bạn muốn có thể kéo các giá trị cột ra theo tên cột, bạn có thể thử tạo con trỏ bằng MySQLdb.cursors.DictCursor. Xem http://stackoverflow.com/questions/10195139/how-to-retrieve-sql-result-column-value-using-column-name-in-python –

-1

row là một tuple. Khi bạn thực hiện row['question_id'], bạn đang cố gắng truy cập một bộ tuple bằng cách sử dụng chỉ mục chuỗi cung cấp cho bạn một lỗi.

+0

vì vậy tôi đã thử hàng sau ['question_id'] [0] nhưng nó vẫn cho tôi cùng một câu trả lời –

+0

'hàng' là một bộ tuple. Tuples trông như thế này: 't = ('a', 'b', 'c')'. Bạn truy cập chúng bằng cách sử dụng một chỉ số nguyên, tức là 't [0] = 'a'',' t [1] =' b'', 't [2] = 'c''. Bạn không thể truy cập chúng bằng cách sử dụng một chuỗi làm chỉ mục; bạn chỉ có thể làm điều đó với một 'dict'. – Lanaru

1

bạn có thể xem tại đây: enter link description here, tôi nghĩ rằng muốn của bạn nó

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

Có nhiều loại con trỏ trong module MySQLdb. Con trỏ mặc định trả về dữ liệu trong một bộ tuple. Khi chúng tôi sử dụng con trỏ từ điển, dữ liệu được gửi dưới dạng từ điển Python. Bằng cách này, chúng ta có thể tham khảo dữ liệu theo tên cột của chúng. 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

Chỉ số nguyên không được phép. Để làm cho nó hoạt động, bạn có thể khai báo DICT như được chỉ định bên dưới:

VarName = {} 

Hy vọng điều này phù hợp với bạn.

1

Để lấy dữ liệu từ cơ sở dữ liệu sử dụng từ điển trỏ

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

Tôi biết câu hỏi là cũ, nhưng tôi tìm thấy một cách khác để làm điều đó mà tôi nghĩ rằng nó là tốt hơn so với các giải pháp chấp nhận. Vì vậy, tôi sẽ để nó ở đây trong trường hợp ai đó cần nó.

Khi tạo con trỏ, bạn có thể sử dụng

cur = connection.cursor(dictionary=True); 

mà sẽ cho phép bạn thực hiện chính xác những gì bạn muốn mà không cần bất kỳ sửa đổi bổ sung.

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

điều này không hoạt động trong python 2.6, nhưng không trong +2.7 – fersarr

Các vấn đề liên quan