TypeError:'NoneType'对象不可迭代

时间:2009-02-09 13:25:35

标签: python mysql

我需要一次处理一行mysql数据,并且我已选择所有行将它们放入元组中,但我得到上面的错误。

这是什么意思,我该怎么做呢?

8 个答案:

答案 0 :(得分:11)

  1. 提供一些代码。
  2. 您可能会调用一些应该更新数据库的函数,但该函数不会返回任何数据(如cursor.execute())。和代码:

    data = cursor.execute()

    使data成为None对象(NoneType)。但是如果没有代码,很难指出错误的确切原因。

答案 1 :(得分:6)

这意味着您尝试迭代的对象实际上是None;也许查询没有产生结果?
你能发一个代码样本吗?

答案 2 :(得分:5)

用于选择所有行的函数返回None。这“可能”(因为你没有提供代码,我只是假设)意味着SQL查询没有返回任何值。

答案 3 :(得分:3)

调用cursor.execute()后尝试使用cursor.rowcount变量。 (此代码无效,因为我不知道您使用的是哪个模块。)

db = mysqlmodule.connect("a connection string")
curs = dbo.cursor()
curs.execute("select top 10 * from tablename where fieldA > 100")
for i in range(curs.rowcount):
  row = curs.fetchone()
  print row

或者,您可以这样做(如果您知道您希望返回结果):

db = mysqlmodule.connect("a connection string")
curs = dbo.cursor()
curs.execute("select top 10 * from tablename where fieldA > 100")
results = curs.fetchall()
if results:
  for r in results:
    print r

答案 4 :(得分:2)

此错误表示您尝试遍历None对象。这就像尝试在C / C ++中循环Null数组一样。正如Abgan,orsogufo,Dan提到的,这可能是因为查询没有返回任何内容。我建议你查看你的查询/数据库连接。

重现此错误的简单代码片段是:

x =无

对于x中的每个i:     #做一点事     通

答案 5 :(得分:0)

当我尝试让'usrsor.fetchone'执行两次时,可能会发生这种情况。像这样:

import sqlite3

db_filename = 'test.db'

with sqlite3.connect(db_filename) as conn:
    cursor = conn.cursor()

    cursor.execute("""
    insert into test_table (id, username, password)
    values ('user_id', 'myname', 'passwd')
    """)

    cursor.execute("""
    select username, password from test_table where id = 'user_id'
    """)

    if cursor.fetchone() is not None:
        username, password = cursor.fetchone()
        print username, password

我不太了解原因。但是我用try修改了它,除了像这样:

import sqlite3

db_filename = 'test.db'

with sqlite3.connect(db_filename) as conn:
    cursor = conn.cursor()

    cursor.execute("""
    insert into test_table (id, username, password)
    values ('user_id', 'myname', 'passwd')
    """)

    cursor.execute("""
    select username, password from test_table where id = 'user_id'
    """)

    try:
        username, password = cursor.fetchone()
        print username, password
    except:
        pass

我猜cursor.fetchone()不能执行两次,因为第一次执行时光标将为None。

答案 6 :(得分:0)

我知道这是一个古老的问题,但我想我又增加了一个可能性。我在调用存储过程时遇到此错误,并在存储过程的顶部添加SET NOCOUNT ON解决了它。问题是早期选择不是程序的最终选择使得它看起来像你有空行集。

答案 7 :(得分:0)

尝试将查询结果附加到列表中,然后您可以访问它。像这样:

try:
    cursor = con.cursor()
    getDataQuery = 'SELECT * FROM everything'
    cursor.execute(getDataQuery)
    result = cursor.fetchall()  
except Exception as e:
    print "There was an error while getting the values: %s" % e
    raise


resultList = []

for r in result:
    resultList.append(r)

现在你有一个可迭代的列表。