SqlAlchemy中的奇怪错误。错误?

问题描述:

我试图用瓶的RESTful + SQLAlchemy的(带自动地图)+ MYSQL SGDB但我不明白,为什么在我的代码发生这样的错误:SqlAlchemy中的奇怪错误。错误?

我发送的请求在我的控制器,它工作正常,但经过10s会产生有关与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语法它确实有效。连接是一样的,但结果不是。

我的代码是下面:

estado.py
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) 

database.py(在EstadoModel进口)

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() 

run.py
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:“选择TBEstados .ID AS TBEstados_idTBEstados。诺姆AS TBEstados_nomeTBEstados .ativo AS TBEstados_ativo \ n从TBEstados \ nWHERE TBEstados .ativo =真正的']

+0

直接使用引擎会根据您的配置使用不同的每个已执行语句的连接,因为会话将保持连接直到关闭。 –

+0

请在ORM中创建'estados'对象的代码(declarative_base或metadata)。你的sqlalchemy与'query'是否在同一个模块中,或者从不同的模块导入? – cowbert

+0

也请发布你在上下文中得到的确切错误。 – Iguananaut

我解决我的问题!

我更改了MySql变量的值wait_timeout的“10s”到100s(测试),并且使用PyMySql提供程序的SqlAlchemy中的错误不再发生。

https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_wait_timeout

感谢您的帮助!