Мне нужно обработать данные mysql по одной строке за раз, и я выбрал все строки, поместив их в кортеж, но я получу ошибку выше.TypeError: объект «NoneType» не является итерабельным
Что это значит и как я могу это сделать?
Мне нужно обработать данные mysql по одной строке за раз, и я выбрал все строки, поместив их в кортеж, но я получу ошибку выше.TypeError: объект «NoneType» не является итерабельным
Что это значит и как я могу это сделать?
Возможно, вы вызываете функцию, которая должна обновлять базу данных, но функция не возвращает никаких данных (например, cursor.execute()
). И код:
данных = cursor.execute()
Делает data
в None
объект (из NoneType
). Но без кода трудно указать на точную причину вашей ошибки.
Это означает, что объект, который вы пытаетесь выполнить итерацию, фактически отсутствует; возможно, запрос не дал никаких результатов?
Не могли бы вы разместить образец кода?
Функция, которую вы использовали для выбора всех возвращенных строк None. Это «возможно» (потому что вы не предоставили код, я только предполагаю) означает, что SQL-запрос не возвращал никаких значений.
Попробуйте использовать переменную cursor.rowcount после вызова cursor.execute(). (этот код не будет работать, потому что я не знаю, какой модуль вы используете).
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
Эта ошибка означает, что вы пытаетесь петлю над None объекта. Это похоже на попытку петли над массивом Null в C/C++. Как сказал Абган, orsogufo, Дан, вероятно, потому, что запрос ничего не возвращал. Я предлагаю вам проверить ваше соединение query/databse.
Простой фрагмент кода для воспроизведения этой ошибки:
х = None
для каждого я х: # сделать что-то проход
Это может произойти, когда я пытаюсь дать " 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
Не знаю много причин. Но я изменил его попробовать, и за исключением, как это:
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, если выполнить ее первый раз.
Я знаю, что это старый вопрос, но я думал, что добавлю еще одну возможность. Я получал эту ошибку при вызове хранимой процедуры и добавлял SET NOCOUNT ON в верхней части хранимой процедуры. Проблема в том, что ранее выбираемые, которые не являются окончательным выбором для процедуры, выглядят так, будто у вас есть пустые наборы строк.
Попробуйте добавить результат запроса в список, и вы можете получить к нему доступ. Что-то вроде этого:
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)
Теперь у вас есть список, который является итерируемым.