2017-12-07 6 views
1

私はスクリプトを実行していて、DBの特定の値を1秒に1回更新しています。 スクリプトの開始時に、私は最初のDBに接続します。PythonがMySQL DBにデータを送信する

conn = pymysql.connect(host= "server", 
       user="user", 
       passwd="pw", 
       db="db", 
       charset='utf8') 
x = conn.cursor() 

私が(30分程度)スクリプトを実行している時間のための接続を開いたままに

このコードでは、私は一度、特定の値を更新秒:

query = "UPDATE missionFilesDelDro SET landLat = '%s', landLon='%s',landHea='%s' WHERE displayName='%s'" % (lat, lon, heading, mission) 
x.execute(query) 
conn.ping(True) 

しかし、私のインターネット接続が切断されると、変数を更新できないため、スクリプトもクラッシュします。私の接続は通常1分以内に再確立されます。 (スクリプトは動いている車で動いていますが、GSMモデム経由でインターネットに接続しています)

変数を更新する前にサーバに接続するたびに再オープンするほうがいいですか?接続が確立されているか、より良い方法がありますか?

答えて

1

クエリの後ではなく、最初に接続にpingするだけで、必要に応じて再接続することができます。

セットアップ:

conn = pymysql.connect(host= "server", 
         user="user", 
         passwd="pw", 
         db="db", 
         charset='utf8') 

と毎秒:

query = "UPDATE missionFilesDelDro SET landLat = '%s', landLon='%s',landHea='%s' WHERE displayName='%s'" % (lat, lon, heading, mission) 
conn.ping() 
x = conn.cursor() 
x.execute(query) 

参考https://github.com/PyMySQL/PyMySQL/blob/master/pymysql/connections.py#L872

それは)((接続がpingの後にドロップすることができることはまだ可能です)が、実行する前に、それは失敗するでしょう。あなたは `x.execute(クエリ)`インターネットのクラッシュの時にどうなるか手順について

from time import sleep 

MAX_ATTEMPTS = 10 

# every second: 
query = "UPDATE missionFilesDelDro SET landLat = '%s', landLon='%s',landHea='%s' WHERE displayName='%s'" % (lat, lon, heading, mission) 
inserted = False 
attempts = 0 

while (not inserted) and attempts < MAX_ATTEMPTS: 
    attempts += 1 
    try: 
     conn.ping() 
     x = conn.cursor() 
     x.execute(query) 
     inserted = True 
    except StandardError: # it would be better to use the specific error, not StandardError 
     sleep(10) # however long is appropriate between tries 
     # you could also do a whole re-connection here if you wanted 

if not inserted: 
    # do something 
    #raise RuntimeError("Couldn't insert the record after {} attempts.".format(MAX_ATTEMPTS)) 
    pass 
+0

THXに似たもの 、トラップに誤りが必要になることを処理するため。 'try:except:'を使う必要があるので、スクリプトがクラッシュしないようにエラーを処理できますか? –

+0

はい。私はそれを行う方法の例で私の答えを編集しました。 @ user3439871 –

+0

ありがとう! –

1

接続が切断されると、x.execute(query)という行で例外が発生してスクリプトが失敗すると思います。

例外をトラップして接続を再試行できます。以下の「疑似Pythonは」一般的な手法を示していますが、明らかに実際の関数、メソッド、および例外名を使用するように適合させる必要があります。

def open_connection(retries, delay):            
    for (x in range(0, retries)):            
     conn = pymysql.connection()            
     if (conn.isOpen()):              
      return conn               
     sleep(delay)                
    return None                 

conn = open_connection(30, 3)             
x = conn.cursor()                

while(conn is not None and more_data)                 

    # read data here                

    query = ...                 

    while(conn is not None): # Loop until data is definitely saved                 
     try:                   
      x.execute(query) 
      break    # data saved, exit inner loop              
     except SomeException:              
      conn = open_connection(30,3)      
      x = conn.cursor() 

一般的なアイデアは、あなたがループする必要があり、どちらかになるまで再試行していることですデータは確実に保存されるか、または回復不能なエラーが発生するまでデータが保存されます。

hm。一定の速度でデータをサンプリングまたは受信していても、ネットワーク障害のために不規則にしか送信できない場合は、古典的なプロデューサ/コンシューマの問題が発生しています。データの読み取りまたは受信には1つのスレッド、バックログを保持するキュー、データを格納する別のスレッドが必要です。楽しい! ;-)

関連する問題