我正在通過一個數據庫與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'無論如何,獲得無,並中止整個事情(或者'fetchone'拋出一個異常,你放棄這種方式)。 – user2357112
是的,在第一個,如果沒有錯誤,else塊運行。所以如果出現錯誤,就沒有回報,第二次嘗試/除了運行。在第二個中,「else block」代碼總是運行,所以如果你有錯誤,它會在第二次嘗試/除了運行之前以輸出名ERROR2結束。也許嘗試看看是否發生了什麼。 – jh44tx
就是這樣,謝謝@ jh44tx – Acoustic77