2016-04-26 10 views
3

私は現在、再スナップのために15分ごとに定期的にシャットダウンするデータベースからリストをインポートするインポートスクリプトに取り組んでいます。Python、 `with`ブロックを再入力

私は接続を作成するときに再試行メカニズムの世話を以下のようにwithブロックを作成しました:

class DBRetryController(object): 
    conn_obj = None 
    connection = None 
    cursor = None 
    retry_count_down = None 
    sleep_time = None 

    def __init__(self, conn_obj, retry_count_down=5, sleep_time=10): 
     self.conn_obj = conn_obj 
     self.retry_count_down = retry_count_down 
     self.sleep_time = sleep_time 

    def __enter__(self): 
     ex = None 
     while self.retry_count_down > 0: 
      try: 
       if hasattr(self.conn_obj, '__call__'): 
        self.connection = self.conn_obj() 
       else: 
        self.connection = self.conn_obj 
       self.cursor = self.connection.cursor() 
       self.retry_count_down = False 
      except OperationalError as ex: 
       log.warning('Caught db error, possibly due to sql server gone away, retrying in a few moment') 
       self.retry_count_down -= 1 
       time.sleep(self.sleep_time) 
     if ex: 
      raise ex 
     return self.connection, self.cursor 

    def __exit__(self, type, value, traceback): 
     try: 
      self.cursor.close() 
      self.connection.close() 
     except: 
      pass 

     if value: 
      raise value 

し、以下のように使用します。

with DBRetryController(self.connection) as (_, cursor): 
    cursor.execute(self.LISTING_QUERY) 

をしかし、問題は、中にサーバ缶のシャットダウンでありますクエリの実行は、DBRetryControllerを変更して、ネストされたコードブロックを再入力することは可能ですか?

+0

_入れ子になったコードブロックを再入力する_。再入力することが何を意味するのか少し説明してもらえますか? – EbraHim

+0

は基本的に最初から '__enter__'からネストされたブロックまで再実行します。 –

+0

プログラム内にグローバルカウンタを定義して、 '__enter__'メソッドの先頭で1を増やすことはできません。最後に1を減らしてください。 'cursor.execute(self.LISTING_QUERY)'を呼び出した後の行では、プログラムの開始時に同じ値になるように値をチェックします(等しくなければ、agianメソッドを呼び出す必要があります)。 – EbraHim

答えて

0

私が正しくあなたの質問を理解していれば、私はあなたがそのようなスキームを使用することができると思う:私のプログラムは、意志、何らかのエラーがrun()メソッドの実行中にoccure場合でも、私は確認したいと仮定しましょう

notCompleted = 1 
class TestClass(): 
    def run(self): 
     global notCompleted 
     notCompleted = 1 
     #do_something here 
     notCompleted = 0 


test = TestClass() 
test.run() 
while(notCompleted): 
    test.run() 

を再試行して終了し、もう一度実行してください。 notCompletedはデフォルトで1です。最初にrunメソッドを呼び出すと、1が割り当てられ、runメソッドの最後に0が割り当てられています。 run()のどこに問題がある場合は、whileループで関数が再び呼び出されます。

Try...Catchも追加する必要があると思います。

+0

お試しいただきありがとうございますが、これは私が探している解決策ではありません。 –