21

我有以下方法,我从表中选择所有 id 并将它们附加到列表并返回该列表。但是当执行这段代码时,我最终得到元组索引必须是整数......错误。我已附上错误和打印出来的方法以及我的方法:

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

打印我的方法的作用:

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
4

7 回答 7

25

python 标准 mysql 库从 cursor.execute 返回元组。要获取您将使用的 question_id 字段row[0],而不是row['question_id']. 这些字段的出现顺序与它们在 select 语句中出现的顺序相同。

提取多个字段的一种不错的方法是

for row in cursor.execute("select question_id, foo, bar from questions"):
    question_id, foo, bar = row
于 2012-09-07T20:57:43.263 回答
8

MySQLdb 模块中有多种游标类型。默认游标返回元组元组中的数据。当我们使用字典游标时,数据以 Python 字典的形式发送。这样我们就可以通过列名来引用数据。来源

#!/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"]
于 2014-08-19T11:15:22.563 回答
6

我知道这个问题很老,但我找到了另一种方法,我认为它比公认的解决方案更好。所以我就把它留在这里以防万一有人需要它。

创建光标时,您可以使用

cur = connection.cursor(dictionary=True);

这将使您无需任何其他修改即可完全按照您的意愿行事。

rows = cur.fetchall()
for row in rows:
    print "%s %s %s" % (row["Id"], row["Name"], row["Price"])
于 2016-08-30T00:00:04.187 回答
2

你可以在这里看到:在此处输入链接描述,我认为这是你想要的

#!/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"])
于 2014-05-22T23:45:52.903 回答
2

要从数据库中检索数据,请使用字典游标

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()
于 2015-12-23T13:03:32.163 回答
1

不允许使用整数索引。为了让它工作,你可以声明如下指定的 DICT:

VarName = {}

希望这对你有用。

于 2015-05-05T05:28:10.127 回答
0

row是一个元组。当你这样做时row['question_id'],你试图使用一个字符串索引来访问一个元组,这会给你一个错误。

于 2012-09-07T20:55:21.893 回答