2017-03-08 101 views
0

我剛剛安裝了一個python包:cx_oracle。從the cx_oracle document我發現了一種方法:Connection.ping(),它被描述爲「Ping可用於測試連接是否仍處於活動狀態的服務器」。cx_oracle中Connection.ping()的返回值是什麼?

但該文件沒有提到ping()的返回值是什麼。

我寫了一些代碼,做一個測試:

#!/usr/bin/env python3 
import cx_Oracle 
conn = cx_Oracle.connect("...") 
print(conn.ping()) # display:None 
conn.close() 
print(conn.ping()) # raise exception: cx_Oracle.InterfaceError: not connected 

從測試結果來看,我發現ping()將返回None是否連接正常或拋出一個異常:連接關閉後cx_Oracle.InterfaceError: not connected

是否還有其他可能的返回值?爲什麼不只是返回True或False?

回答

0

cx_Oracle documentation states that這是:

此方法的一個擴展DB API定義,並且僅在Oracle 10g中R2可用和更高。

然而,這種方法不記錄在PEP 249 - 當前Python數據庫API規範無論是在connection methodsoptional extensions(或其他爲此事的任何地方)。

PEP 249的MySQL實現也是has this method;該文檔指出:

當連接不可用時,將引發一個InterfaceError。使用 的is_connected()方法檢查連接而不會引起 錯誤。

因錯誤引發InterfaceError

由於這是等同於cx_Oracle行爲我會假設,這是回答你的問題,你已經確定什麼樣的行爲是正確的是:

  • 時如果不歸路連接是活動
  • 如果如果我們看一下the code for .ping()的連接處於不活動

一個InterfaceError升高時,就已經證實這是在方式該方法已實施:

static PyObject *Connection_Ping(
    udt_Connection *self,    // connection 
    PyObject* args)      // arguments 
{ 
    sword status; 

    if (Connection_IsConnected(self) < 0) 
     return NULL; 
    status = OCIPing(self->handle, self->environment->errorHandle, 
      OCI_DEFAULT); 
    if (Environment_CheckForError(self->environment, status, 
      "Connection_Ping()") < 0) 
     return NULL; 
    Py_INCREF(Py_None); 
    return Py_None; 
}