大家好,我希望能得到一些建议。我似乎不能按照我想要的顺序运行这个2 TRY / EXCEPT语句。但是,如果我先将STEP2放在STEP1之后,它们会很有效。
此当前代码仅打印出来。
Transferred: x rows.
如果翻转,则会同时打印。
Unfetched: x rows.
Transferred: x rows.
我试过了:
根据示例分配单独的cur.close()和db.commit() here,也没有工作。 (附带问题:我应该关闭/提交 然而他们个别?这是一般的良好做法还是 基于上下文的?)
对第2步使用cur.rowcount方法以及我认为可能是 问题出在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()
原谅我的任何非Pythonic方式,因为我仍然是一个非常初学者。非常感谢任何建议,谢谢!
答案 0 :(得分:1)
你有两个明显的非Pythonic代码:使用一个裸except:
而不说你想要捕获哪个异常,并使用pass
除了阻止所以异常完全被忽略!
像这样的代码的问题是,如果出现问题,你将永远不会看到错误信息,所以你无法找出错误。
问题可能是你的“mainreplace”查询删除了“cachelog”表中的所有内容,因此在它没有行之后的“balance”查询,因此fetchone()
失败,抛出异常以及它后面的行从未被执行过。或者也许是完全不同的东西,很难从这里说出来。
如果你没有那个尝试/除了那里,你会得到一个很好的错误信息,你不必问这个问题。