我試圖用瓶的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.pyfrom 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_id
,TBEstados
。諾姆AS TBEstados_nome
,TBEstados
.ativo AS TBEstados_ativo
\ n從TBEstados
\ nWHERE TBEstados
.ativo =真正的']
直接使用引擎會根據您的配置使用不同的每個已執行語句的連接,因爲會話將保持連接直到關閉。 –
請在ORM中創建'estados'對象的代碼(declarative_base或metadata)。你的sqlalchemy與'query'是否在同一個模塊中,或者從不同的模塊導入? – cowbert
也請發佈你在上下文中得到的確切錯誤。 – Iguananaut