sqlalchemy + MySQL连接超时

Tom*_*Tom 6 python mysql sqlalchemy

我有一个使用sqlalchemy与MySQL数据库交互的守护进程.由于交互很少,因此连接很容易超时.我试图通过在创建数据库引擎时设置各种标志来解决问题,例如pool_recycle=3600,但似乎没有任何帮助.

为了帮助我调试问题,我将本地mysql服务器的超时设置为10秒,并尝试了以下程序.

import time
import sqlalchemy

engine = sqlalchemy.engine.create_engine("mysql://localhost")

while True:
    connection = engine.connect()
    result = connection.execute("SELECT 1")
    print result.fetchone()
    connection.close()
    time.sleep(15)
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,我继续得到如下例外情况:

sqlalchemy.exc.OperationalError: (OperationalError) (2006, 'MySQL server has gone away')
Run Code Online (Sandbox Code Playgroud)

但是,如果我删除了呼叫connection.close(),问题就会消失.这里发生了什么?为什么sqlalchemy每次打电话时都没有尝试建立新的连接connect()

我正在使用Python 2.7.3与sqlalchemy 0.9.8和MySQL 5.5.40.

kak*_*ace 5

该文件提到:

MySQL具有自动关闭连接行为,
适用于闲置八小时或更长时间的连接。为了避免出现此问题,请使用pool_recycle选项来控制任何连接的最长使用期限:

引擎= create_engine('mysql + mysqldb:// ...',pool_recycle = 3600)

您可以在调用create_engine时仅放入“ pool_recycle”参数。


Cod*_*ker 2

我不确定这是否能解决您的问题,但我在处理 mysql 时遇到了类似的问题。当我使用 pymysql 连接数据库时才修复。

你可以这样安装:

pip install pymysql
Run Code Online (Sandbox Code Playgroud)

它适用于 Linux 和 Windows(如果你安装了它)

然后给你的连接字符串像这样:

import time
import sqlalchemy

engine = sqlalchemy.engine.create_engine("mysql+pymysql://localhost")

while True:
    connection = engine.connect()
    result = connection.execute("SELECT 1")
    print result.fetchone()
    connection.close()
    time.sleep(15)
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到以下输出:

(1,)
(1,)
(1,)
(1,)
Run Code Online (Sandbox Code Playgroud)

另一方面,我发现 SQLAlchemy 0.9.8 会破坏某些查询。我必须安装 0.9.3 版本才能使我的应用程序不再损坏。