私は現在、再スナップのために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
を変更して、ネストされたコードブロックを再入力することは可能ですか?
_入れ子になったコードブロックを再入力する_。再入力することが何を意味するのか少し説明してもらえますか? – EbraHim
は基本的に最初から '__enter__'からネストされたブロックまで再実行します。 –
プログラム内にグローバルカウンタを定義して、 '__enter__'メソッドの先頭で1を増やすことはできません。最後に1を減らしてください。 'cursor.execute(self.LISTING_QUERY)'を呼び出した後の行では、プログラムの開始時に同じ値になるように値をチェックします(等しくなければ、agianメソッドを呼び出す必要があります)。 – EbraHim