2 Оператор Try / Except не работает в обычном порядке, но работает, когда коды переворачиваются
Добрый день, ребята, я надеюсь получить небольшой совет по этому вопросу. Я не могу заставить этот оператор 2 TRY/EXCEPT работать в том порядке, в котором я их хочу. Тем не менее, они отлично работают, если я сначала поставлю STEP2, а затем STEP1.
Этот текущий код распечатывается только.
Transferred: x rows.
Если перевернуто, они печатают оба.
Unfetched: x rows.
Transferred: x rows.
Я старался:
Назначение отдельных cur.close() и db.commit() согласно примерам здесь также не сработало. (Дополнительный вопрос: должен ли я, тем не менее, закрывать / фиксировать их по отдельности? Это общая хорошая практика или основанная на контексте?)
Используя метод cur.rowcount для шага 2, я подумал, что, возможно, проблема была в стороне SQL, но проблема все еще сохраняется.
Сделал поиск по SO и не смог найти ни одного подобного случая.
Запуск на Python 2.7. Код:
import MySQLdb
import os
#Initiate connection to database.
db = MySQLdb.connect(host="localhost",user="AAA",passwd="LETMEINYO",db="sandbox")
cur = db.cursor()
#Declare variables.
viewvalue = "1"
mainreplace = (
"INSERT INTO datalog "
"SELECT * FROM cachelog WHERE viewcount = %s; "
"DELETE FROM cachelog WHERE viewcount = %s; "
% (viewvalue, viewvalue)
)
balance = (
"SELECT COUNT(*) FROM cachelog "
"WHERE viewcount > 1"
)
#STEP 1: Copy and delete old data then print results.
try:
cur.execute(mainreplace)
transferred = cur.rowcount
print "Transferred: %s rows." %(transferred)
except:
pass
#STEP 2: Check for unfetched data and print results.
try:
cur.execute(balance)
unfetched = cur.fetchone()
print "Unfetched: %s rows." % (unfetched)
except:
pass
#Confirm and close connection.
cur.close()
db.commit()
db.close()
Прошу прощения за любой мой непифонический образ жизни, так как я все еще начинающий. Любой совет высоко ценится, спасибо!
1 ответ
У вас есть два вопиющих непифоновых фрагмента кода: использование голого except:
не говоря, какое исключение вы хотите поймать, и используя pass
в этом, кроме блока, поэтому исключение полностью игнорируется!
Проблема с таким кодом заключается в том, что если что-то пойдет не так, вы никогда не увидите сообщение об ошибке, поэтому вы не сможете выяснить, в чем дело.
Возможно, проблема в том, что ваш запрос "mainreplace" удаляет все из таблицы "cachelog", поэтому запрос "balance" после него не имеет строк, поэтому fetchone()
терпит неудачу, выдает исключение и строку после него никогда не выполняется. Или, может быть, что-то совершенно другое, трудно сказать отсюда.
Если у вас не было этой попытки / кроме как там, у вас было бы хорошее сообщение об ошибке, и вам не пришлось бы задавать этот вопрос.