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__'
答案 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]
确实返回None
而NoneType
确实没有方法__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的代码进行绝对必要的修改。无论如何,我刚刚纠正了这一点,因为你是对的。