web-dev-qa-db-fra.com

TypeError: Les index de tuple doivent être des entiers et non des str

J'essaie d'extraire des données d'une base de données et de les affecter à différentes listes. cette erreur spécifique me donne beaucoup de problèmes "TypeError: Les index de tuples doivent être des entiers, pas str", j'ai essayé de le convertir en float et etc, mais sans succès.

le code va comme ci-dessous

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"])

voici un exemple de résultat de l'instruction print:

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

et c'est l'erreur exacte que j'obtiens:

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

toute aide serait appréciée ! merci les gens!

20
Harsha Jasti

Comme le dit l'erreur, row est un tuple, vous ne pouvez donc pas le faire row["pool_number"]. Vous devez utiliser l'index: row[0].

24
Daniel Roseman

TL; DR: ajoute le paramètre cursorclass=MySQLdb.cursors.DictCursor à la fin de votre MySQLdb.connect.


J'ai eu un code de travail et la base de données a déménagé, je devais changer l'hôte/utilisateur/passe. Après ce changement, mon code a cessé de fonctionner et j'ai commencé à avoir cette erreur. Après une inspection plus minutieuse, j'ai copié-collé la chaîne de connexion sur un emplacement doté d'une directive supplémentaire. L'ancien code se lit comme suit:

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

Qui a été remplacé par:

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

Le paramètre cursorclass=MySQLdb.cursors.DictCursor à la fin faisait python me permettre d’accéder aux lignes en utilisant les noms de colonnes comme index. Mais le médiocre copier-coller éliminait cela, ce qui donnait l’erreur.

Ainsi, au lieu des solutions déjà présentées, vous pouvez également ajouter ce paramètre et accéder aux lignes de la façon dont vous le vouliez initialement. ^ _ ^ J'espère que cela aide les autres.

6
msb

Le problème est de savoir comment accéder à row

Plus précisément row["waocs"] Et row["pool_number"] De ocs[row["pool_number"]]=int(row["waocs"])

Si vous recherchez le official-documentation de fetchall() que vous trouvez.

La méthode extrait toutes les lignes (ou toutes les lignes restantes) d'un ensemble de résultats de requête et renvoie une liste de nuplets.

Par conséquent, vous devez accéder aux valeurs des lignes avec row[__integer__] Comme row[0]

3
Altoyyr