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!
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]
.
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.
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]