pyMySQL:如何检查连接是否已打开或关闭

时间:2017-06-28 07:02:08

标签: python mysql pymysql

我收到错误InterfaceError (0, '')。在Pymysql库中是否有方法可以检查连接或游标是否已关闭。对于游标,我已经使用了类似的上下文管理器:

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

5 个答案:

答案 0 :(得分:7)

您可以使用Connection.open属性。

如果连接打开,Connection.open字段将为1,否则为0。所以你可以说

if conn.open:
    # do something
  

conn.open属性将告诉您连接是否已经存在   明确关闭或是否已检测到远程关闭。   但是,您始终可能尝试发出查询和   突然发现连接已经发出 - 没有办法   提前检测到这一点(事实上,它可能发生在   发出查询的过程),所以唯一真正安全的东西就是包装   你在try / except块中调用

答案 1 :(得分:1)

在if语句中使用conn.connection。

def bar():   
    def callback(*args, **kwargs):
        status['triggered'] = True

    signal.connect(callback)

    # wait until signal triggered
    loops = 0
    while loops < 100 and not status['triggered']:
        pass
    if status['triggered']:
        # timeout logic to prevent hangs
    # do whatever you want after the signal triggered

答案 2 :(得分:0)

我认为try和catch可能会成功,而不是只检查游标。

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

答案 3 :(得分:0)

我最初使用AKHIL MATHEW的解决方案来调用conn.open,但后来在测试期间发现,即使连接断开,conn.open有时也会返回正结果。可以肯定的是,我发现可以调用conn.ping()来实际测试连接。该函数还接受可选参数(reconnect = True),如果ping失败,它将导致它自动重新连接。

当然要为此付出代价-顾名思义,ping实际上会发送到服务器并测试连接。您不想在每次查询前都执行此操作,但就我而言,我有一个AWS lambda在热启动时旋转并尝试重用连接,因此我认为我有理由在每次热启动时测试一次连接,如果它已经丢失了。

答案 4 :(得分:0)

这是我的操作方式,因为即使连接断开,我仍然希望运行查询:

def reconnect():
    mydb=pymysql.Connect(host='localhost',user='root',password='password',database='demo_db',ssl={"fake_flag_to_enable_tls":True},autocommit=True)
    return mydb.cursor()


try:
    if (c.connection.open != True):
        c=reconnect() # reconnect
    if c.connection.open:
        c.execute(query)
        return c.fetchall()
except Exception as e:
    return str(e)