sqlalchemy.exc.OperationalError:(MySQLdb._exceptions.OperationalError)(2006,'MySQL服务器已消失')

时间:2019-09-29 17:39:13

标签: python mysql sqlalchemy python-multiprocessing mysql-python

我正在尝试制作flask应用来处理一些机器人。我已经连接了MySQL数据库,其中包括几个表。我正在使用SQLAlchemy和数据库一起工作(而不是flask-sqlachemy,因为我也将我的数据库也用于我的机器人,并且很难从其他模块进行访问)。 Bot正在使用multiprocessing.Process模块在​​新进程中运行。所有示例如下。我一直在寻找不同的解决方案,如何使用sessions处理SQLAlchemy。现在,我使用的方法是使用session为每个请求创建@contextmanager

new_engine = create_engine('mysql://username:password@localhost/db_name', pool_pre_ping=True, pool_recycle=280)
SessionAccounts = scoped_session(sessionmaker(bind=new_engine))

@contextmanager
def session_scope():
    session = SessionAccounts()
    try:
        yield session
        session.commit()
    except:
        session.rollback()
        raise

我还使用session_scope()方法

finally:
    session.close()

想法来自SQLAlchemy documentation

这是我正在使用的函数的示例,并且返回错误。

def add_token(value):
    with session_scope() as db_session:
        try:
            new_token = Tokens(value=value, received=datetime.datetime.now())
            db_session.add(new_token)
            return True
        except Exception as exp:
            return False

但是总是在随机超时和随机插入之后,每次尝试插入时,我第一次和下一次都收到错误:

[SQL: INSERT INTO tokens (value, received) VALUES (%s, %s)]
[parameters: ('LONG STRING about 500 characters', datetime.datetime(2019, 9, 29, 18, 40, 19, 778298))]

是的,我处理了Exception,但是我只是丢失了数据,因此无济于事。

这不是我第一次尝试解决断开连接问题。在我使用一个session之前,我在全局启动应用程序时对其进行了初始化。接下来使用它们。但是它返回了相同的错误。所以我一直在寻找新的解决方案。其中之一就是这个。它应该工作。每次我开始新的session。进行一些查询,例如selectadddelete。在每个查询之后,如果没有异常,则提交,否则回滚。但是工作了1-2分钟后,如果开始返回我错误。

您知道处理会话的更好方法吗?如何从多个进程访问MySQL数据库并正确处理sessions?我也在stackoverflow.com上寻找不同的解决方案。没有人帮助。

0 个答案:

没有答案