mysqldb .. Объект 'NoneType' не может быть подписан

Этот код работает нормально, когда cur.execute() а также db.commit() строки закомментированы; то есть, если все, что я делаю - это печатаю запрос, эта программа запускается для n строк. Проблема, кажется, возникает здесь:

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

Когда я пытаюсь вставить результат, я получаю:

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

Код:

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)

1 ответ

Решение

Причина вашей ошибки:

player_categories_statistics = cur.fetchone()

Это устанавливает player_categories_statistics в None, None[0] Возникает исключение.

Единственная причина, по которой это произойдет, - ваш запрос не возвращает строк, что означает, что ваша таблица пуста Ваша таблица, скорее всего, пуста, потому что вы никогда не помещаете в нее какие-либо строки, или менее вероятно, что вы их как-то удалили.

Я виновник может быть следующим, вы вставляете в sometable и выбирая из players:

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

против

SELECT %s FROM players

Единственная причина, по которой это возможно, заключается в том, что вы заставляете его зацикливаться, даже если ничего не было возвращено с помощью строки:

rowcount = 2 #hard-coded for debugging

Дополнительная информация:

Вот рабочий запрос, который я выполнил для базы данных sqlite3 с одной таблицей с одной строкой с почти такими же утверждениями, как у вас, просто чтобы показать, что ваш должен работать, если данные действительно есть.

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

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

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

Вот еще один рабочий запрос к базе данных sqlite3 с другой таблицей и без строк.

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

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

Как видите, идентично поведению выше.

Также убедитесь, что rowcount работает так, как вы хотите с вашей БД. Это не с sqlite3, например. См. Спецификацию rowcount в http://www.python.org/dev/peps/pep-0249/ и обратитесь к документации по MySQLdb.

Другие вопросы по тегам