python,NoneType对象没有属性'__getitem__',MySQL查询

时间:2014-04-24 14:12:27

标签: python mysql

def getRowFromPolynomes(self, paramId):
    qry = 'SELECT * FROM polynomes WHERE par_id = %d' % paramId
    self.edb.curs.execute(qry)
    row = self.edb.curs.fetchone()
    return row

def fixPolynomes(self):
    rowCount = self.edb.curs.execute('SELECT par_id FROM params')
    for x in xrange(0, rowCount):

        # THE PROGRAM FAILS AT THIS LINE, HOWEVER paramId is correctly received.
        # IT IS CORRECTLY PRINTED, NAMELY THE 28731 AT THE BEGINNING OF MY OUTPUT
        paramId =  self.edb.curs.fetchone()[0]
        print paramId

        result = self.getRowFromPolynomes(paramId)
        if result is None:
            self.addRowToPolynomes(1, paramId)

数字2873是self.edb.curs.fetchone()[0]的预期输出,它被正确打印,程序仍然在第45行失败,这是第paramId = self.deb.curs.fetchone()[0]

我不明白,我在这里错过了什么?

我的输出:

>>> 28371
 Traceback (most recent call last):
   File "db.py", line 60, in <module>
    db.fixPolynomes()
  File "db.py", line 45, in fixPolynomes
    paramId =  self.edb.curs.fetchone()[0]
TypeError: 'NoneType' object has no attribute '__getitem__'

1 个答案:

答案 0 :(得分:2)

问题是您在两种方法中都使用self.edb.curs,因此在第一次迭代期间,游标会获取一行进行查询:

SELECT par_id FROM params

然后在这个循环内你打电话:

result = self.getRowFromPolynomes(paramId)

并且此方法使用相同的游标执行查询:

SELECT * FROM polynomes WHERE par_id = %d

因此第一个查询的结果被删除,但rowCount的值在:

for x in xrange(0, rowCount):

保持不变。

后一个查询只返回一行,播下次fetchone()的调用:

paramId = self.edb.curs.fetchone()[0]

确实返回NoneNoneType确实没有方法__getitem__,因此索引访问失败。

<强>解决方案:

def fixPolynomes(self):
    self.edb.curs.execute(
        'SELECT params.par_id, polynomes.* FROM params LEFT OUTER JOIN polynomes ON params.par_id = polynomes.par_id'
    )
    for result in self.edb.curs:
        if result[1] is None:
            self.addRowToPolynomes(1, paramId)

您可以调整此方法,但绝对不需要方法getRowFromPolynomes(self, paramId),因为您可以在一个查询中连接两个表 感谢@Mertijn的评论。我知道它,但我只是想对OP的代码进行绝对必要的修改。无论如何,我刚刚纠正了这一点,因为你是对的。