ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

python – 我应该如何在瓶子应用程序中使用sqlalchemy会话以避免在查询期间“丢失与MySQL服务器的连接”

2019-07-25 03:15:13  阅读:304  来源: 互联网

标签:bottle python mysql sqlalchemy pythonanywhere


我的瓶子/ sqlalchemy应用程序托管在pythonanywhere.com上,不确定这是否重要,我希望不是.在我离开它一段时间之后,应用程序抛出’在查询期间丢失与MySQL服务器的连接’.然后我刷新它,它工作正常.

请注意,我也没有sqlachemy实现相同的查询,仅使用MySQLdb.该实现始终工作正常,它从不抛出异常,因为它每次都建立一个新的连接.

我假设,在像pythonanywhere这样的托管环境中,我无法摆弄可能影响此错误的mysql配置,例如max_allowed_pa​​cket或timeout.

我应该如何创建sqlalchemy引擎和会话来解决这个问题?

bottle_app.py:

db_host = 'localhost'
db_user = 'root'
db_password = 'gggggg'
db_dbname = 'test'

#web framework imports
from bottle import default_app, route, run, template, redirect

#sqlalchemy and mysql setup
mysql_connect_string = 'mysql+mysqldb://%s:%s@%s/%s?charset=utf8' % (db_user, db_password, db_host, db_dbname)
from sqlalchemy import create_engine
engine = create_engine(mysql_connect_string)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
Base.metadata.bind = engine
from sqlalchemy import Column, Integer, String, Float, SmallInteger
from sqlalchemy.orm import sessionmaker
DBSession = sessionmaker()
DBSession.bind = engine

#import mysql package for raw SQL
import MySQLdb

#sqlalchemy model class for table 'nevek'
class Person(Base):
    __tablename__ = 'nevek'
    # Here we define columns for the table nevek
    id = Column(Integer, primary_key=True)
    name = Column(String(250), nullable=False)
    lev = Column(SmallInteger)
    point = Column(Float)
    play = Column(Integer)
    kmp = Column(Float)

#get records from table nevek with sqlalchemy
def get_nevek_from_db():
    session = DBSession()
    result = session.query(Person).all()
    session.close()
    return result

#basic handler will redirect to nevek
@route('/')
def hello_world():
    redirect('/nevek')

@route('/nevek')
def nevek():
    return template('nevek-obj', nevek=get_nevek_from_db())

#get records from table nevek
def get_raw_sql(sql):
    conn = MySQLdb.connect(host=db_host, user=db_user,
        passwd=db_password, db=db_dbname, charset='utf8')
    cur = conn.cursor()
    cur.execute(sql)
    res = cur.fetchall()
    cur.close()
    conn.close()
    return res

@route('/nevek-raw')
def nevek_raw():
    return template('nevek-tuple', nevek=get_raw_sql("SELECT * FROM nevek"))


#this will be imported and run by the wsgi.py (in hosted env)
application = default_app()

#this will be used when running on your own machine
if __name__ == '__main__':
    run(application)

例外:

2015-02-25 12:43:57,107 :Traceback (most recent call last):
2015-02-25 12:43:57,108 :  File "/usr/local/lib/python2.7/dist-packages/bottle.py", line 764, in _handle
2015-02-25 12:43:57,108 :    return route.call(**args)
2015-02-25 12:43:57,108 :  File "/usr/local/lib/python2.7/dist-packages/bottle.py", line 1575, in wrapper
2015-02-25 12:43:57,108 :    rv = callback(*a, **ka)
2015-02-25 12:43:57,108 :  File "/home/bpgergo/bridge/bottle_app.py", line 49, in nevek
2015-02-25 12:43:57,108 :    return template('nevek-obj', nevek=get_nevek_from_db())
2015-02-25 12:43:57,108 :  File "/home/bpgergo/bridge/bottle_app.py", line 38, in get_nevek_from_db
2015-02-25 12:43:57,109 :    result = session.query(Person).all()
2015-02-25 12:43:57,109 :  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2241, in all
2015-02-25 12:43:57,109 :    return list(self)
2015-02-25 12:43:57,109 :  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2353, in __iter__
2015-02-25 12:43:57,109 :    return self._execute_and_instances(context)
2015-02-25 12:43:57,109 :  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2368, in _execute_and_instances
2015-02-25 12:43:57,109 :    result = conn.execute(querycontext.statement, self._params)
2015-02-25 12:43:57,109 :  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 662, in execute
2015-02-25 12:43:57,109 :    params)
2015-02-25 12:43:57,109 :  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 761, in _execute_clauseelement
2015-02-25 12:43:57,109 :    compiled_sql, distilled_params
2015-02-25 12:43:57,109 :  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 874, in _execute_context
2015-02-25 12:43:57,109 :    context)
2015-02-25 12:43:57,109 :  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1024, in _handle_dbapi_exception
2015-02-25 12:43:57,109 :    exc_info
2015-02-25 12:43:57,109 :  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/util/compat.py", line 196, in raise_from_cause
2015-02-25 12:43:57,109 :    reraise(type(exception), exception, tb=exc_tb)
2015-02-25 12:43:57,109 :  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 867, in _execute_context
2015-02-25 12:43:57,109 :    context)
2015-02-25 12:43:57,110 :  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/default.py", line 324, in do_execute
2015-02-25 12:43:57,110 :    cursor.execute(statement, parameters)
2015-02-25 12:43:57,110 :  File "/usr/local/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 205, in execute
2015-02-25 12:43:57,110 :    self.errorhandler(self, exc, value)
2015-02-25 12:43:57,110 :  File "/usr/local/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
2015-02-25 12:43:57,110 :    raise errorclass, errorvalue
2015-02-25 12:43:57,110 :OperationalError: (OperationalError) (2013, 'Lost connection to MySQL server during query') 'SELECT nevek.id AS nevek_id, nevek.name AS nevek_name, nevek.lev AS nevek_lev, nevek.point AS nevek_point, nevek.play AS nevek_play, nevek.kmp AS nevek_kmp \nFROM nevek' ()

解决方法:

你可以试试看,让我知道

通过使用pool_recycle我认为你可以过来.

http://docs.sqlalchemy.org/en/rel_0_9/dialects/mysql.html#connection-timeouts

更换

engine = create_engine(mysql_connect_string)

通过

engine = create_engine(mysql_connect_string, pool_size=100, pool_recycle=280)

连接超时

MySQL features an automatic connection close behavior, for connections
that have been idle for eight hours or more. To circumvent having this
issue, use the pool_recycle option which controls the maximum age of
any connection:

engine = create_engine(‘mysql+mysqldb://…’, pool_recycle=3600)

标签:bottle,python,mysql,sqlalchemy,pythonanywhere
来源: https://codeday.me/bug/20190725/1528566.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有