mysqldb .. Das Objekt 'NoneType' ist nicht abonnierbar
-
28-10-2019 - |
Frage
Dieser Code funktioniert einwandfrei, wenn die Zeilen cur.execute()
und db.commit()
auskommentiert sind.Wenn ich nur die Abfrage drucke, wird dieses Programm für n Zeilen ausgeführt.Das Problem scheint hier aufzutreten:
player_categories_statistics = cur.fetchone()
player_id = player_categories_statistics[0]
Wenn ich versuche, das Ergebnis einzufügen, erhalte ich:
Traceback (most recent call last):
File "test2.py", line 72, in <module>
meat = meatgrind(league_name, categories_measurement_statistics)
File "test2.py", line 32, in meatgrind
player_id = int(player_categories_statistics[0])
TypeError: 'NoneType' object is not subscriptable
Der Code:
import sys
import MySQLdb
import string
db = MySQLdb.connect()
cur = db.cursor('localhost','me',XXXXX,'testdb')
def meatgrind(league_name,categories_measurement_statistics):
# a varied range of different categories can be used
# 1. list categories
categories = []
categories_string = "player_id"
categories_string_newtable = "meatgrinded_player_id, player_id"
for category in categories_measurement_statistics:
categories_string += ", " + category[0]
categories_string_newtable += ", " + category[0]
# 2. get players and statistics
query = "SELECT %s FROM players" % (categories_string)
cur.execute("%s" % (query))
# rowcount = int(cur.rowcount)
rowcount = 2 #hard-coded for debugging
# 3. meatgrind one player at a time
meatgrinded_player_id = 1
for i in range(rowcount):
player_categories_statistics = cur.fetchone()
player_id = player_categories_statistics[0]
#4. grind a category statistic
meatgrindings_string = "%d, %d" % (meatgrinded_player_id, player_id)
index = 1
for category in categories_measurement_statistics:
# SOME MATH HERE resulting in player_meatgrindings
meatgrindings_string += ", %0.4f" % player_meatgrindings
query = """INSERT INTO sometable (%s) VALUES (%s)""" % (categories_string_newtable, meatgrindings_string)
cur.execute("%s" % (query))
db.commit()
meatgrinded_player_id += 1
league_name = 'test'
categories_measurement_statistics = (('H', 156.3, 19.643093216474604), ('HR', 21.3, 9.003147597738618), ('SB', 13.25, 16.041179646286754))
meat = meatgrind(league_name, categories_measurement_statistics)
Lösung
Der Grund für Ihren Fehler ist:
player_categories_statistics = cur.fetchone()
Hiermit wird player_categories_statistics
auf None
gesetzt. None[0]
löst die Ausnahme aus.
Der einzige Grund, warum dies passieren würde, ist, dass Ihre Abfrage keine Zeilen zurückgibt, was bedeutet, dass Ihre Tabelle leer ist. Ihre Tabelle ist höchstwahrscheinlich leer, weil Sie nie Zeilen eingefügt haben oder weniger wahrscheinlich, dass Sie sie irgendwie entfernt haben.
Ich bin schuld daran, dass Folgendes ist: Sie fügen es in den sometable
ein und wählen aus dem players
aus:
INSERT INTO sometable (%s) VALUES (%s)
vs
SELECT %s FROM players
Der einzige Grund, warum dies möglich ist, besteht darin, dass Sie eine Schleife erzwingen, auch wenn mit der Zeile nichts zurückgegeben wurde:
rowcount = 2 #hard-coded for debugging
Zusätzliche Informationen:
Hier ist eine funktionierende Abfrage, die ich in einer sqlite3-Datenbank mit einer einzelnen Tabelle mit einer einzelnen Zeile mit nahezu identischen Anweisungen wie Ihre ausgeführt habe, um zu zeigen, dass Ihre funktionieren sollte, wenn die Daten tatsächlich vorhanden sind.
query = "SELECT %s FROM customer" % 'first_name, last_name'
row = c.execute("%s" % (query)).fetchone()
row
Out[28]: (u'Derek', u'Litz')
Hier ist eine weitere Arbeitsabfrage für eine SQLite3-Datenbank mit einer anderen Tabelle und ohne Zeilen.
query = "SELECT %s FROM customer2" % 'first_name, last_name'
print c.execute("%s" % (query)).fetchone()
None
Wie Sie sehen können, identisch mit dem obigen Verhalten.
Stellen Sie außerdem sicher, dass die Zeilenanzahl mit Ihrer Datenbank ordnungsgemäß funktioniert. Zum Beispiel nicht mit sqlite3. Siehe Rowcount-Spezifikation unter http://www.python.org/dev/peps/ pep-0249 / # cursor_objects und konsultieren MySQLdb-Dokumente.