4

当数据库启动时,以下cx_Oracle代码可以正常工作:

#!C:\Python27
import cx_Oracle

try:
    conn = cx_Oracle.connect("scott/tiger@oracle")

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

但是,如果在我运行此脚本时数据库恰好关闭,NameError则会引发 a:

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 中,确保您的数据库连接关闭,同时仍然优雅地处理关闭数据库的情况的最佳方法是什么?

做以下事情对我来说似乎是一个巨大的kludge:

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

2 回答 2

12

您可以尝试初始化conn为预先None设置并在finally块中进行测试。这是有效的,因为连接设置为其他东西的唯一位置是打开时。所以打开意味着未打开None并且None意味着未打开:

#!C:\Python27
import cx_Oracle

conn = None
try:
    conn = cx_Oracle.connect("scott/tiger@oracle")

    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()
于 2014-08-28T17:02:07.550 回答
-3

(不完全是一个答案,但评论没有很好的格式)

尝试这个:

#!C:\Python27
import cx_Oracle

try:
    conn = cx_Oracle.connect("scott/tiger@oracle")

    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/tiger@oracle")
    curs = conn.cursor()
    curs.execute("SELECT dummy FROM sys.dual")
    print curs.fetchone()[0]
    curs.close()
    conn.close()
except Exception as e:
    print e

顺便说一句,我假设连接和光标将在退出时自动关闭,从而无需显式关闭它们。

于 2011-03-10T12:16:49.240 回答