【发布时间】:2017-09-14 22:04:07
【问题描述】:
我正在使用 python 浏览一个数据库,并大量使用 try 和 except 来处理查询。在尝试优化我的代码时,我遇到了一个奇怪的问题。
这段代码:
try:
cursor.execute("SELECT my_name FROM {}.{} LIMIT 1".format(myschema,mytable))
except(Exception, psycopg2.DatabaseError) as error:
conn.rollback()
else:
origName = cursor.fetchone()
if origName is None:
outputName = "ERROR2"
return outputName
try:
cursor.execute("SELECT different_column FROM {}.{} ORDER by a_column DESC LIMIT 1".format(myschema, mytable))
except(Exception, psycopg2.DatabaseError) as error:
conn.rollback()
try:...
#more try/excepts and so on
运行整个数据仓库大约需要 19 分钟。
但是这个代码:
try:
cursor.execute("SELECT my_column FROM {}.{} LIMIT 1".format(myschema,mytable))
except(Exception, psycopg2.DatabaseError) as error:
conn.rollback()
origName = cursor.fetchone()
if origName is None:
outputName = "ERROR2"
return outputName
try:
cursor.execute("SELECT different_column FROM {}.{} ORDER by a_column DESC LIMIT 1".format(myschema, mytable))
except(Exception, psycopg2.DatabaseError) as error:
conn.rollback()
try:...
#exact same code with try/excepts and so on
字面意思是在大约 1-1.5 分钟内完成运行。如果我删除它,为什么它会快得多?是否有某些内容被跳过/忽略?我觉得我一定做错了。我真的不明白如何在try:except: 语句之后继续我的代码。
【问题讨论】:
-
在第二个版本中,如果有错误,你
fetchone无论如何,得到 None 并中止整个事情(或者可能fetchone引发异常并且你以这种方式中止)。跨度> -
是的,在第一个中,如果没有错误,则运行 else 块。所以如果有错误,没有返回,第二次 try/except 运行。在第二个中,“else block”代码始终运行,因此如果您有错误,它将在第二个 try/except 运行之前以 outputname ERROR2 完成。也许尝试看看是否发生了这种情况。
-
就是这样,谢谢@jh44tx
标签: python sql exception optimization try-catch