MySQLDB .. L'objet «non-étintype» n'est pas indiqué
-
28-10-2019 - |
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)
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.