【问题标题】:mysqldb .. 'NoneType' object is not subscriptablemysqldb .. 'NoneType' 对象不可下标
【发布时间】:2012-01-13 16:08:41
【问题描述】:

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)

【问题讨论】:

  • 你必须编辑你的代码以获得正确的格式 - 否则你的肉磨函数看起来像无效的语法:) 我会这样做,但我只能猜测函数在哪里结束。跨度>
  • 您确定您的players 表中有数据吗?
  • players table is chock full ..我在这方面有点新手..所以如果肉磨()失败,我很尴尬,但它不会传递一个简单的字符串和元组categories_measurement_statitistics 中的元组?这似乎很好,但也许有一些我看不到的东西。
  • @NathanHoad 绞肉功能以这个单一调用开始和结束。您会看到传递给此调用的所有内容。
  • @Cole 然后更正您的缩进以反映这一点?

标签: python mysql-python


【解决方案1】:

您的错误原因是:

player_categories_statistics = cur.fetchone()

这会将player_categories_statistics 设置为NoneNone[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

如您所见,与上述行为相同。

还要确保行计数以您希望的方式与您的数据库一起工作。例如,它不适用于 sqlite3。请参阅 http://www.python.org/dev/peps/pep-0249/#cursor_objects 中的行计数规范并查阅 MySQLdb 文档。

【讨论】:

  • 我是一个新手,包括一个使用stackoverflow的新手,我不知道检查答案。你的想法很周到,所以我很讨厌这张迟交的感谢信
猜你喜欢
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 2015-01-23
  • 2022-01-12
相关资源
最近更新 更多