2011-03-09 36 views
3

以下cx_Oracle代碼工作正常時,數據庫已啓動:關閉一個cx_Oracle連接,同時允許唐氏數據庫

#!C:\Python27 
import cx_Oracle 

try: 
    conn = cx_Oracle.connect("scott/[email protected]") 

    try: 
     curs = conn.cursor() 
     curs.execute("SELECT dummy FROM sys.dual") 
     print curs.fetchone()[0] 
    finally: 
     curs.close() 
finally: 
    conn.close() 

但如果數據庫恰好是下來的時候我運行此腳本,一個NameError上升:

Traceback (most recent call last): 
    File "C:\Users\ArtMetzer\Documents\Code\Python\db_conn_test.py", line 14, in <module> 
    conn.close() 
NameError: name 'conn' is not defined 

這對我來說很有意義:cx_Oracle無法實例化一個連接,所以可變conn從來沒有得到設定,因此沒有close()方法。

在Python中,什麼是確保數據庫連接關閉的最佳方式,同時還能正常處理關閉數據庫的情況?

做類似下面似乎是一個龐大的雜牌對我說:

finally: 
    try: 
     conn.close() 
    except NameError: 
     pass 

回答

-2

(不完全是一個答案,但意見沒有很好格式化)

試試這個:

#!C:\Python27 
import cx_Oracle 

try: 
    conn = cx_Oracle.connect("scott/[email protected]") 

    try: 
     curs = conn.cursor() 
     curs.execute("SELECT dummy FROM sys.dual") 
     print curs.fetchone()[0] 
    finally: 
     curs.close() 
     conn.close() 
except Exception as e: 
    print e 

不理想,但應該更好地工作。我也想知道爲什麼這麼多的嵌套。爲什麼不這樣做:

#!C:\Python27 
import cx_Oracle 

try: 
    conn = cx_Oracle.connect("scott/[email protected]") 
    curs = conn.cursor() 
    curs.execute("SELECT dummy FROM sys.dual") 
    print curs.fetchone()[0] 
    curs.close() 
    conn.close() 
except Exception as e: 
    print e 

順便說一句,我有這樣的假設,即連接,光標會自動關閉退出,不再需要顯式地關閉它們。

+0

在最後一個例子,curs.close()和conn.close()如果curs.execute()失敗永遠不會被調用。不過,我敢打賭,在退出期間一切都會被清理乾淨。必須檢查Oracle中的活動連接以查看連接是否得到清理。 – Doug 2014-09-19 22:17:28

4

您可以嘗試初始化conn,類似於None之類的東西,並在finally塊中測試。這是有效的,因爲只有當連接被設置爲其他東西時纔會打開它。因此,打開意味着非NoneNone意味着未開口:

#!C:\Python27 
import cx_Oracle 

conn = None 
try: 
    conn = cx_Oracle.connect("scott/[email protected]") 

    try: 
     curs = conn.cursor() 
     curs.execute("SELECT dummy FROM sys.dual") 
     print curs.fetchone()[0] 
    finally: 
     curs.close() 
finally: 
    if conn is not None: 
     conn.close()