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
Ответы
Ответ 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']
, вы пытаетесь получить доступ к кортежу, используя индекс строки, который дает вам ошибку.