3

データベース操作を行う関数があります。データベースからデータをフェッチする前に、カーソル オブジェクトが null であるかどうか、およびタイムアウトのために接続が切断されているかどうかを確認したいという特別なことをしたいと考えています。Python で事前チェ​​ックを行うにはどうすればよいですか?

私の関数、foo、bar:

 Class A:
   connect = None
   cursor = None

   def connect(self)
      self.connect = MySQLdb.connect ( ... )
      self.cursor = self.connect.cursor()
   def foo (self) :
       self.cursor.execute("SELECT * FROM car_models");
   def bar (self) :
       self.cursor.execute("SELECT * FROM incomes");
4

2 に答える 2

5

操作前のチェックの問題は、チェックしている悪い状態がチェックと操作の間に発生する可能性があることです。

たとえばis_timed_out()、接続がタイムアウトしたかどうかを確認するメソッドがあるとします。

if not self.cursor.is_timed_out():
    self.cursor.execute("SELECT * FROM incomes")

一見すると、これは実行呼び出しからの CursorTimedOut 例外の可能性を回避したように見えます。しかし、is_timed_out を呼び出して False を返し、カーソルがタイムアウトになり、execute 関数を呼び出して例外を受け取る可能性があります。

はい、それがちょうどいいタイミングで起こる可能性は非常に低いです。しかし、サーバー環境では、1 日に数回、100 万分の 1 の確率で発生します。悪い質。

操作が例外で失敗することに備える必要があります。そして、これらの問題に対して例外処理を行うと、事前チェックは不要になるため、不要になります。

于 2013-03-30T13:37:18.553 に答える
1

カーソルが null かどうかを簡単に確認できます。

if cursor is None:
     ... do something ...

それ以外の場合、Python での通常のことは、「許可ではなく許しを求める」ことです。データベース接続を使用し、タイムアウトになった場合は例外をキャッチして処理します (そうしないと、テストと実行するポイントの間でタイムアウトになることがあります)。これを使って)。

于 2013-03-30T13:32:01.710 に答える