使用 SQLAlchemy(MySQL) 和 Flask 时 MySQL 连接不可用

Tua*_*hau 6 python mysql sqlalchemy flask flask-sqlalchemy

我有时会收到此错误(有时正常,有时错误):

sqlalchemy.exc.OperationalError: (OperationalError) MySQL Connection not available.
Run Code Online (Sandbox Code Playgroud)

使用时session.query

我正在使用 Flask 和 SQLAlchemy (MySQL) 编写一个简单的服务器。我的app.py这样:

Session = sessionmaker(bind=engine)
session = Session()

@app.route('/foo')
def foo():
    try:
        session.query(Foo).all()
    except Exception:
        session.rollback()
Run Code Online (Sandbox Code Playgroud)

更新 我还在session另一个文件中创建新的并调用它app.py

Session = sessionmaker(bind=engine)
session = Session()

def foo_helper(): #call in app.py
    session.query(Something).all()
Run Code Online (Sandbox Code Playgroud)

更新 2 我的engine

engine = create_engine('path')
Run Code Online (Sandbox Code Playgroud)

我怎样才能避免这个错误?

谢谢你!

Nim*_*ush 7

使用 SQLAlchemy \xe2\x80\x98create_engine\xe2\x80\x99 函数时,请确保 \xe2\x80\x98pool_recycle option\xe2\x80\x99 的值小于 MYSQLs wait_timeout 值。

\n\n
engine = create_engine("mysql://username:password@localhost/myDatabase", pool_recycle=3600)\n
Run Code Online (Sandbox Code Playgroud)\n\n

尝试使用以下方式scoped_session进行会话:

\n\n
from sqlalchemy.orm import scoped_session, sessionmaker\nsession = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))\n
Run Code Online (Sandbox Code Playgroud)\n\n

并在检索数据后关闭/删除您的会话。

\n\n
session.query(Foo).all()\nsession.close()\n
Run Code Online (Sandbox Code Playgroud)\n

  • 是的。scoped_session 通过代理模式提供底层 Session 的所有方法,因此您可以在scoped_session上调用 close() ,这会在实际会话上调用 close() ,或者您可以调用remove() ,它会发出 close() 然后删除来自注册表的 Session 对象本身。后者的优点是在会话上建立任何特定状态,例如基于连接的绑定(请参阅http://www.sqlalchemy.org/docs/orm/session.html#joining-a-session-中的示例) into-an-external-transaction )或其他特定的构造函数选项将被丢弃 (3认同)