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()

しかし、このスクリプトを実行したときにデータベースがダウンしていると、aNameErrorが発生します。

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
4

2 に答える 2

12

事前に初期化connして、ブロックNoneでテストすることができます。finally接続が別の場所に設定されるのは、接続が開かれたときだけであるため、これは機能します。したがって、opened は non-NoneNone意味し、not-open を意味します。

#!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 に答える