Python SQLAlchemy/MySQL在查询过程中与MySQL服务器失去连接

Python SQLAlchemy/MySQL在查询过程中与MySQL服务器失去连接,python,mysql,macos,sqlalchemy,Python,Mysql,Macos,Sqlalchemy,SQLAlchemy(0.9.8)和mysql-5.6.21-osx10.8-x86_64以及MAC OS X 10.3.3(约塞米蒂) 我时断时续地说: InterfaceError: (InterfaceError) 2013: Lost connection to MySQL server during query u'SELECT..... ' 我已经阅读了一些线程,大多数情况下都是通过将其添加到my.cnf来解决的 max_allowed_packet = 1024M 这应该

SQLAlchemy(0.9.8)和mysql-5.6.21-osx10.8-x86_64以及MAC OS X 10.3.3(约塞米蒂)

我时断时续地说:

InterfaceError: (InterfaceError) 2013: Lost connection to MySQL server during query u'SELECT..... '
我已经阅读了一些线程,大多数情况下都是通过将其添加到my.cnf来解决的

   max_allowed_packet = 1024M
这应该足够我做的事了。做完这件事后,我间歇性地踩了一下。并将该行放入/etc/my.cnf:

   log-error = "/Users/<myname>/tmp/mysql.err.log"
   log-warnings = 3
我已经到了一个地步,我认为更多的细节和更好的日志记录可能会有所帮助,或者在这之前我还可以尝试其他方法


谢谢。

看起来你的MySQL连接在长时间不活动后超时了,我打赌如果你一直使用现有设置查询数据库,这种情况不会发生。MySQL和sql双方都有一些设置可以解决这个问题:

  • 检查SQLa引擎的
    pool\u recycle
    值,尝试不同的/较小的值,例如1800(秒)。如果要从文件中读取DB设置,请将其设置为

    回收池:1800

  • 否则在引擎初始化期间指定它,例如

    from sqlalchemy import create_engine
    e = create_engine("mysql://user:pass@localhost/db", pool_recycle=1800)
    
  • 检查/修改您的
    wait\u timeout
    MySQL变量,查看服务器在关闭非交互连接之前等待活动的秒数。e、 g

    显示全局变量,如“等待超时”

  • 找到适合您的环境的组合

    根据来自和互联网上许多其他文章的建议,使用下面的decorator包装我的所有功能,帮助我解决了mariadb作为后端数据库时的“连接丢失”问题。请注意,下面的
    db
    flask\u sqlalchemy.sqlalchemy
    的一个实例,但是sqlalchemy会话的概念也将保持不变

    def manage_session(f):
        def inner(*args, **kwargs):
    
            # MANUAL PRE PING
            try:
                db.session.execute("SELECT 1;")
                db.session.commit()
            except:
                db.session.rollback()
            finally:
                db.session.close()
    
            # SESSION COMMIT, ROLLBACK, CLOSE
            try:
                res = f(*args, **kwargs)
                db.session.commit()
                return res
            except Exception as e:
                db.session.rollback()
                raise e
                # OR return traceback.format_exc()
            finally:
                db.session.close()
        return inner
    
    我还在Flask SQLAlchemy配置中添加了50秒的pool_循环,但这对解决方案没有明显的帮助

    编辑1: 下面是在最终代码中如何使用它的示例片段:

    from flask_restful import Resource
    
    class DataAPI(Resource):
    
        @manage_session
        def get(self):
            # Get data rows from DB
    
    

    我不认为我的案子应该暂停。我在对数据库的连续请求中遇到了这个错误,因此我的代码不断地查询数据库。我怀疑这是由于“缓冲区”相关的问题,因为我的“累积”结果集字节大小可能相当大,尽管单个请求结果集可能不一定很大。我也遇到了同样的问题,我在第10分钟每小时运行一个cronjob。为此,我正在进行连接,但每10小时它就会显示2013年的连接丢失错误。有什么建议吗?这个解决方案对我从来都不起作用。我已经设置了pool_recycle和pool_pre_ping,但它从未解决过这个问题。你怎么称呼它?@RyanH-添加了一个示例作为对答案的编辑。
    from flask_restful import Resource
    
    class DataAPI(Resource):
    
        @manage_session
        def get(self):
            # Get data rows from DB