Question

Ce code fonctionne bien lorsque le cur.execute() et db.commit() Les lignes sont commentées; c'est-à-dire que si tout ce que je fais est d'imprimer la requête, ce programme s'exécute pour n nombre de lignes. Le problème semble se produire ici:

player_categories_statistics = cur.fetchone()
player_id = player_categories_statistics[0]

Quand j'essaye d'insérer le résultat, j'obtiens:

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

Le 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)
Était-ce utile?

La solution

La raison de votre erreur est:

player_categories_statistics = cur.fetchone()

Cela set player_categories_statistics à None. None[0] augmente l'exception.

La seule raison pour laquelle cela se produirait est que votre requête ne renvoie pas de lignes, ce qui signifie que votre table est vide. Votre table est probablement vide car vous n'y mettez jamais de lignes, ou moins vous les avez probablement retirées d'une manière ou d'une autre.

Je sert peut être les suivants, vous insérez dans sometable et sélectionner parmi players:

INSERT INTO sometable (%s) VALUES (%s)

contre

SELECT %s FROM players

La seule raison pour laquelle cela est possible est que vous le forçant à boucler même si rien n'a été retourné avec la ligne:

rowcount = 2 #hard-coded for debugging

Information additionnelle:

Voici une requête de travail que j'ai exécutée sur une base de données SQLite3 avec une seule table avec une seule ligne avec des instructions presque identiques comme la vôtre, juste pour montrer que le vôtre devrait fonctionner si les données sont effectivement là.

query = "SELECT %s FROM customer" % 'first_name, last_name'

row = c.execute("%s" % (query)).fetchone()

row
Out[28]: (u'Derek', u'Litz')

Voici une autre requête de travail sur une base de données SQLite3 avec une autre table et pas de lignes.

query = "SELECT %s FROM customer2" % 'first_name, last_name'

print c.execute("%s" % (query)).fetchone()
None

Comme vous pouvez le voir, identique au comportement ci-dessus.

Assurez-vous également que RowCount fonctionne comme vous le souhaitez avec votre base de données. Ce n'est pas avec SQLite3, par exemple. Voir RowCount Spec dans http://www.python.org/dev/peps/pep-0249/#cursor_objects et consulter les documents MySQLDB.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top