web-dev-qa-db-ja.com

pyMySQL:接続がすでに開いているか閉じているかを確認する方法

エラーInterfaceError (0, '')が発生します。 Pymysqlライブラリに接続またはカーソルが閉じているかどうかを確認する方法はありますか?カーソルの場合、私はすでに次のようなコンテキストマネージャーを使用しています。

with db_connection.cursor() as cursor:
  ....
5
Volatil3

Connection.open属性を使用できます。

Connection.openフィールドは、接続が開いている場合は1、それ以外の場合は0になります。だからあなたは言うことができます

if conn.open:
    # do something

Conn.open属性は、接続が明示的に閉じられたかどうか、またはリモートの閉じが検出されたかどうかを示します。ただし、クエリを発行しようとすると、突然接続が切断されたことが判明する可能性が常にあります。これを事前に検出する方法はありません(実際、クエリの発行プロセス中に発生する可能性があります)。本当に安全なのは、呼び出しをtry/exceptブロックでラップすることだけです。

11
AKHIL MATHEW

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))
2
Arun Tom

カーソルだけをチェックするのではなく、try andcatchでうまくいくかもしれないと思います。

try:
   c = db_connection.cursor()
except OperationalError:
   connected = False
else:
   connected = True
   #code here
1
Eliethesaiyan

私は当初、AKHIL MATHEWのソリューションを使用してconn.openを呼び出しましたが、後でテスト中に、接続が失われた場合でもconn.openが肯定的な結果を返すことがあることがわかりました。確かに、実際に接続をテストする conn.ping() を呼び出すことができることがわかりました。この関数は、オプションのパラメーター(reconnect = True)も受け入れます。これにより、pingが失敗した場合に自動的に再接続されます。

もちろん、これにはコストがかかります。名前が示すように、pingは実際にサーバーに送信され、接続をテストします。すべてのクエリの前にこれを実行する必要はありませんが、私の場合、ウォームスタートでAWSラムダが起動し、接続を再利用しようとしているので、ウォームスタートごとに1回接続をテストし、次の場合に再接続することを正当化できると思います。それは失われました。

0
mojoken