エラーInterfaceError (0, '')
が発生します。 Pymysql
ライブラリに接続またはカーソルが閉じているかどうかを確認する方法はありますか?カーソルの場合、私はすでに次のようなコンテキストマネージャーを使用しています。
with db_connection.cursor() as cursor:
....
Connection.open属性を使用できます。
Connection.openフィールドは、接続が開いている場合は1、それ以外の場合は0になります。だからあなたは言うことができます
if conn.open:
# do something
Conn.open属性は、接続が明示的に閉じられたかどうか、またはリモートの閉じが検出されたかどうかを示します。ただし、クエリを発行しようとすると、突然接続が切断されたことが判明する可能性が常にあります。これを事前に検出する方法はありません(実際、クエリの発行プロセス中に発生する可能性があります)。本当に安全なのは、呼び出しをtry/exceptブロックでラップすることだけです。
Ifステートメントでconn.connectionを使用します。
import pymysql
def conn():
mydb=pymysql.Connect('localhost','root','password','demo_db',autocommit=True)
return mydb.cursor()
def db_exe(query,c):
try:
if c.connection:
print("connection exists")
c.execute(query)
return c.fetchall()
else:
print("trying to reconnect")
c=conn()
except Exception as e:
return str(e)
dbc=conn()
print(db_exe("select * from users",dbc))
カーソルだけをチェックするのではなく、try andcatchでうまくいくかもしれないと思います。
try:
c = db_connection.cursor()
except OperationalError:
connected = False
else:
connected = True
#code here
私は当初、AKHIL MATHEWのソリューションを使用してconn.openを呼び出しましたが、後でテスト中に、接続が失われた場合でもconn.openが肯定的な結果を返すことがあることがわかりました。確かに、実際に接続をテストする conn.ping() を呼び出すことができることがわかりました。この関数は、オプションのパラメーター(reconnect = True)も受け入れます。これにより、pingが失敗した場合に自動的に再接続されます。
もちろん、これにはコストがかかります。名前が示すように、pingは実際にサーバーに送信され、接続をテストします。すべてのクエリの前にこれを実行する必要はありませんが、私の場合、ウォームスタートでAWSラムダが起動し、接続を再利用しようとしているので、ウォームスタートごとに1回接続をテストし、次の場合に再接続することを正当化できると思います。それは失われました。