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)

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top