2011-03-09 38 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()