Python: индексы кортежей должны быть целыми, а не str при выборе из таблицы mysql - программирование

Python: индексы кортежей должны быть целыми, а не str при выборе из таблицы 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

Печать того, что делает мой метод:

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
4b9b3361

Ответ 1

Стандартная библиотека mysql python возвращает кортежи из 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

Ответ 2

В модуле 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"]

Ответ 3

Я знаю, что вопрос старый, но я нашел другой способ сделать это, что я думаю, что это лучше, чем принятое решение. Поэтому я просто оставлю это здесь, если кому-то это понадобится.

При создании курсора вы можете использовать

cur = connection.cursor(dictionary=True);

который позволит вам делать именно то, что вы хотите, без каких-либо дополнительных изменений.

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

Ответ 4

вы можете увидеть здесь: введите ссылку здесь, я думаю, что ваше желание

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

Ответ 5

Для извлечения данных из базы данных используйте словарь курсора

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

Ответ 6

Целочисленные индексы не допускаются. Чтобы получить работу, вы можете объявить DICT, как указано ниже:

VarName = {}

Надеюсь, это сработает для вас.

Ответ 7

row является кортежем. Когда вы выполняете row['question_id'], вы пытаетесь получить доступ к кортежу, используя индекс строки, который дает вам ошибку.