web-dev-qa-db-ja.com

TypeError:タプルインデックスはstrではなく整数でなければなりません

データベースからデータを取得し、それらを異なるリストに割り当てようとしています。この特定のエラーは、「TypeError:タプルインデックスはstrではなく整数でなければなりません」という多くのトラブルを引き起こしています。floatなどに変換しようとしましたが、成功しませんでした。

コードは次のようになります

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

printステートメントの出力例は次のとおりです。

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

これは私が得ている正確なエラーです:

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

助けていただければ幸いです!人々に感謝します!

20
Harsha Jasti

エラーが言うように、rowはタプルなので、row["pool_number"]。インデックスを使用する必要があります:row[0]

24
Daniel Roseman

TL; DR:パラメーターcursorclass=MySQLdb.cursors.DictCursorの最後にMySQLdb.connect


動作するコードがあり、DBが移動したため、Host/user/passを変更する必要がありました。この変更の後、コードが機能しなくなり、このエラーが発生し始めました。よく調べて、追加のディレクティブがある場所に接続文字列をコピーして貼り付けました。古いコードは次のようになります。

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

次のものに置き換えられました。

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

パラメーターcursorclass=MySQLdb.cursors.DictCursorが最後にpythonを作成していたので、インデックスとして列名を使用して行にアクセスできるようになりました。

したがって、すでに提示されているソリューションの代替として、このパラメーターを追加して、元の方法で行にアクセスすることもできます。 ^ _ ^これが他の人に役立つことを願っています。

6
msb

問題はrowにアクセスする方法です

特に、ocs[row["pool_number"]]=int(row["waocs"])の_row["waocs"]_および_row["pool_number"]_

fetchall()official-documentation を検索すると、見つかります。

このメソッドは、クエリ結果セットのすべての(または残りのすべての)行をフェッチし、タプルのリストを返します。

したがって、行の値には_row[__integer__]_のような_row[0]_でアクセスする必要があります

3
Altoyyr