c.fetchone()
может вернуть None
, если больше нет строк для возврата.Если ваш запрос SELECT
создает только одну строку, и , если round()
вызвало исключение, то повторный вызов c.fetchone()
может привести к None
, возвращаемому в except
обработчик.Проблема здесь заключается в том, что вызов c.fetchone()
несколько раз не приведет к тому, что одна и та же первая строка будет возвращена для последующих вызовов.
Вызовите c.fetchone()
один раз и проверьте, вернул ли онЗначение, отличное от None
, прежде чем что-либо делать с ним:
c.execute("""SELECT some_data FROM data_table WHERE date='{}'""".format(dat))
row = c.fetchone()
if row is not None:
try:
my_list.append(round(row[0]))
except ValueError: # value that can't be rounded
continue
Обратите внимание, что почти всегда плохая идея использовать бланк except
.Поймайте только ожидаемые исключения, никогда больше ничего.Теперь вы можете легко маскировать ошибки памяти или блокировать прерывания.
Примечание: вы широко открыты для атак SQL-инъекций . не используйте форматирование строки для интерполяции значений, всегда используйте параметры SQL, чтобы драйвер базы данных позаботился о правильном экранировании значений:
c.execute("""SELECT some_data FROM data_table WHERE date=?""", (dat,))
?
знак вопроса является заполнителем параметра SQL, а кортеж передает в качестве второго аргумента значения параметра.