TypeError: tuple indices must be integers, not str

PythonSqlDatabase

Python Problem Overview


I am trying to pull data from a database and assign them to different lists. This specific error is giving me a lot of trouble "TypeError: tuple indices must be integers, not str" I tried converting it to float and etc, but to no success.

The code goes as below

conn=MySQLdb.connect(*details*)
cursor=conn.cursor()
ocs={}
oltv={}
query="select pool_number, average_credit_score as waocs, average_original_ltv as waoltv from *tablename* where as_of_date= *date*"
cursor.execute(query)
result=cursor.fetchall()

for row in result:
 print row
 ocs[row["pool_number"]]=int(row["waocs"])
 oltv[row["pool_number"]]=int(row["waoltv"])

Sample output of print statement is as follows :

('MA3146', 711L, 81L)
('MA3147', 679L, 83L)
('MA3148', 668L, 86L)

And this is the exact error I am getting:

ocs[row["pool_number"]]=int(row["waocs"])
TypeError: tuple indices must be integers, not str

Any help would be appreciated! Thanks people!

Python Solutions


Solution 1 - Python

Like the error says, row is a tuple, so you can't do row["pool_number"]. You need to use the index: row[0].

Solution 2 - Python

I think you should do

for index, row in result: 

If you wanna access by name.

Solution 3 - Python

TL;DR: add the parameter cursorclass=MySQLdb.cursors.DictCursor at the end of your MySQLdb.connect.


I had a working code and the DB moved, I had to change the host/user/pass. After this change, my code stopped working and I started getting this error. Upon closer inspection, I copy-pasted the connection string on a place that had an extra directive. The old code read like:

 conn = MySQLdb.connect(host="oldhost",
                        user="olduser",
                        passwd="oldpass",
                        db="olddb", 
                        cursorclass=MySQLdb.cursors.DictCursor)

Which was replaced by:

 conn = MySQLdb.connect(host="newhost",
                        user="newuser",
                        passwd="newpass",
                        db="newdb")

The parameter cursorclass=MySQLdb.cursors.DictCursor at the end was making python allow me to access the rows using the column names as index. But the poor copy-paste eliminated that, yielding the error.

So, as an alternative to the solutions already presented, you can also add this parameter and access the rows in the way you originally wanted. ^_^ I hope this helps others.

Solution 4 - Python

I know it is not specific to this question, but for anyone coming in from a Google search: this error is also caused by a comma behind an object that creates a tuple rather than a dictionary

>>>dict = {}
>>>tuple = {},

Tuple

>>>tuple_ = {'key' : 'value'},
>>>type(tuple_)
<class 'tuple'>

Dictionary

>>>dict_ = {'key' : 'value'} 
>>>type(dict_)        
<class 'dict'>

Solution 5 - Python

Just adding a parameter like the below worked for me.

cursor=conn.cursor(dictionary=True)

I hope this would be helpful either.

Solution 6 - Python

The Problem is how you access row

Specifically row["waocs"] and row["pool_number"] of ocs[row["pool_number"]]=int(row["waocs"])

If you look up the official-documentation of fetchall() you find.

>The method fetches all (or all remaining) rows of a query result set and returns a list of tuples.

Therefore you have to access the values of rows with row[__integer__] like row[0]

Solution 7 - Python

SQlite3 has a method named row_factory. This method would allow you to access the values by column name.

https://www.kite.com/python/examples/3884/sqlite3-use-a-row-factory-to-access-values-by-column-name

Solution 8 - Python

I see that you're trying to identify by the name of a row. If you are looking for a specific column within the row, you can do [integer][column name]

For example, to iterate through each row and only pull out the value from the row with the column header of "pool number", you can do this:

for row in df_updated.iterrows():
    cell = row[1]['pool number']
    print(cell)

The code will then iterate through each row but only print out the value that matches the "pool number" column

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionHarsha JastiView Question on Stackoverflow
Solution 1 - PythonDaniel RosemanView Answer on Stackoverflow
Solution 2 - PythonSitti Munirah Abdul RazakView Answer on Stackoverflow
Solution 3 - PythonmsbView Answer on Stackoverflow
Solution 4 - PythonMartin CronjeView Answer on Stackoverflow
Solution 5 - PythonMironView Answer on Stackoverflow
Solution 6 - PythonJDurstbergerView Answer on Stackoverflow
Solution 7 - PythonRaccon32View Answer on Stackoverflow
Solution 8 - PythonRobin DuongView Answer on Stackoverflow