我尝试使用Flask-Restful + SqlAlchemy(使用Automap)+ MySql SGDB,但我不明白为什么在我的代码中出现此错误:
我在我的控制器中发送了请求并且它正常工作,但是在10秒之后生成了与SGDB断开连接的错误。
itens = session.query(estados).filter(estados.ativo == True)
但更奇怪的是,如果我使用SQL字符串语法,则不会出现问题。
itens = engine.execute("SELECT `TBEstados`.`id`, `TBEstados`.`nome`, `TBEstados`.`ativo` FROM `intbr_webapp`.`TBEstados`;")
我使用的是SqlAlchemy 1.2,但我也试过了1.1版本。我也尝试过使用pre-ping=true
并且我没有取得成功。
有人对此有所了解吗?我不明白为什么使用ORM结构不起作用,但是使用SQL语法它确实有效。连接相同,但结果不是。
我的代码如下:
from flask import jsonify
from flask_restful import Resource
from json import dumps
from resources.database import Base, session, engine
#from resources.dataEncoder import JsonModel
from models.TBEstados import TBEstadosSchema
class Estados(Resource):
def get(self):
estados = Base.classes.TBEstados
itens = session.query(estados).filter(estados.ativo == True)
result = TBEstadosSchema(many=True).dump(itens)
return jsonify(result.data)
from flask import Flask, g
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import sessionmaker
from flask_marshmallow import Marshmallow
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = my conn string
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_POOL_RECYCLE'] = 3600
app.config['SQLALCHEMY_POOL_TIMEOUT'] = 30
Base = automap_base()
engine = create_engine(app.config['SQLALCHEMY_DATABASE_URI'], pool_pre_ping=True)
# reflect the tables
Base.prepare(engine, reflect=True)
Session = sessionmaker(bind=engine)
session = Session()
ma = Marshmallow()
from flask import Flask, g
from flask_restful import Resource, Api
import resources.database
from controllers.Estados import Estados
app = Flask(__name__)
api = Api(app)
api.add_resource(Estados, '/estados')
if __name__ == '__main__':
app.run(debug=True, port=9002)
确切错误:
sqlalchemy.exc.OperationalError
sqlalchemy.exc.OperationalError:(pymysql.err.OperationalError)(2013,'查询期间与MySQL服务器的连接丢失')[SQL:' SELECT TBEstados
。id AS {{1 }},TBEstados_id
。nome AS TBEstados
,TBEstados_nome
。ativo AS TBEstados
\ nFROM TBEstados_ativo
\ nWHERE TBEstados
。ativo = true&#39 ]
答案 0 :(得分:0)
我解决了我的问题!
我改变了" 10s"的MySql变量 wait_timeout 的值。使用PyMySql提供程序的SqlAlchemy中的100s(测试)和错误并没有再次发生。
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_wait_timeout
感谢您的帮助!