【问题标题】:SQLAlchemy + MariaDB: MySQL server has gone awaySQLAlchemy + MariaDB:MySQL 服务器已经消失
【发布时间】:2018-12-27 07:18:36
【问题描述】:

我知道以前有人问过这个问题,但我无法让它发挥作用。我正在编写一个应用程序来删除网络上的一些股票信息。抓取部分大约需要 70 分钟才能完成,我将我的 SQLAlchemy 对象传递给一个函数。 函数完成后,它应该将数据插入到数据库的数据中,这就是我收到错误的时候。我猜 MariaDB 已经关闭了会话?

代码:

    with get_session() as session:
        stocks = session.query(Stock).filter(or_(Stock.market.like('%Large%'), Stock.market.like("%First North%"))).all()
        for stock, path in chrome.download_stock(stocks=stocks): # This function takes about 70 minutes, not using any session in here, only Stock objects
            # Starting to insert and get the error on the first insert

错误: sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (2006, 'MySQL server has gone away')

get_session() 函数:

@contextmanager
def get_session(debug=False):
    engine = create_engine('mysql://root:pw@IP/DB', echo=debug, encoding='utf8', pool_recycle=300, pool_pre_ping=True)
    Base.metadata.create_all(engine)
    Session = sessionmaker(bind=engine)
    session = Session()
    try:
        yield session
        session.commit()
    except:
        session.rollback()
        raise
    finally:
        session.close()

我尝试将 pool_recycle 减少到 300 秒并添加 SQLAlchemny 1.2 附带的新 pool_pre_ping 但没有任何效果。有任何想法吗?你认为它是在代码中还是在服务器端?

MariaDB:10.2.14

SQLAlchemy:1.2.7

编辑: 开始调查 MariaDB wait_timeout 是因为 FrankerZ 的评论有一些有趣的结果,首先来自 mysql-command:

SHOW SESSION VARIABLES LIKE 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
1 row in set (0.00 sec)

然后通过Python/SQLAlchemy:

print(session.execute("SHOW SESSION VARIABLES LIKE 'wait_timeout';").first())
('wait_timeout', '600')

对此有何解释?应该是问题吧?

【问题讨论】:

  • 你需要更新mysql的keepalive timeout(这个和SQLAlchemy无关)

标签: python mysql sqlalchemy mariadb


【解决方案1】:

至少有 2 个“wait_timeouts”;这很混乱。

连接后立即执行

SET SESSION wait_timeout=12000

这将给你 200 分钟。

还要确保 SQLAlchemy 没有超时。 (例如,PHP 就可以。)

【讨论】:

  • 将 session.execute("SET wait_timeout=28800") 添加到我的 get_sessions 命令中,它现在可以工作了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 2011-04-25
  • 2011-06-07
  • 2010-12-20
  • 2013-04-26
  • 2017-01-21
相关资源
最近更新 更多