【问题标题】:MySQL Connection not available when use SQLAlchemy(MySQL) and Flask使用 SQLAlchemy(MySQL) 和 Flask 时 MySQL 连接不可用
【发布时间】:2014-11-12 16:38:10
【问题描述】:

我有时会收到此错误(有时是好的,有时是错误的):

sqlalchemy.exc.OperationalError: (OperationalError) MySQL Connection not available.

在使用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()

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

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

def foo_helper(): #call in app.py
    session.query(Something).all()

更新 2 我的engine

engine = create_engine('path')

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

谢谢!

【问题讨论】:

  • 如何创建engine?您确定您的连接详细信息正确吗?
  • 并确保您拥有实际连接到 MySQL 所需的包。
  • 我连接MySQL成功。我的服务器运行正常,但它关闭了,因为有时(并非总是)出现该错误。我的意思是我确定engine 是正确的
  • 查看 Flask-SQLAlchemy,它为您抽象了很多内容。

标签: python mysql flask sqlalchemy flask-sqlalchemy


【解决方案1】:

在使用 SQLAlchemy 的“create_engine”函数时,确保“pool_recycle option”的值小于您的 MYSQLs wait_timeout 值。

engine = create_engine("mysql://username:password@localhost/myDatabase", pool_recycle=3600)

尝试使用scoped_session 进行会话:

from sqlalchemy.orm import scoped_session, sessionmaker
session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))

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

session.query(Foo).all()
session.close()

【讨论】:

  • 通过最后一个解决方案,你的意思是我每次查询时都需要关闭并重新打开,不是吗?
  • 是的。 scoped_session 通过代理模式提供底层 Session 的所有方法,因此您可以在 scoped_session 上调用 close(),后者在实际会话上调用 close(),或者您可以调用 remove(),它发出 close() 然后删除来自注册表的 Session 对象本身。后者的优点是会话上建立的任何特定状态,例如基于连接的绑定(参见 sqlalchemy.org/docs/orm/… 中的示例)或其他特定的构造函数选项,都将被丢弃
猜你喜欢
  • 2015-11-17
  • 1970-01-01
  • 2018-06-13
  • 2019-12-28
  • 2020-04-06
  • 1970-01-01
  • 2015-09-11
  • 2016-12-05
  • 1970-01-01
相关资源
最近更新 更多