使用backref选项的队列池溢出导致flask sqlalchemy超时错误



我是烧瓶sqlalchemy的初学者。我遇到了一个问题,可能是使用backref引起的。

api(视图api。它呈现模板(是这样的。

@board.route('/')
def index():
page = request.args.get('page', 1, type=int)
q = Article.query.order_by(Article.create_date.desc())
article_list_pagination = q.paginate(page, per_page=10)
return render_template('board.html', article_list=article_list_pagination)

模型就像这个

class Answer(db.Model):
__tablename__ = 'answer'
id = db.Column(db.Integer, primary_key=True)
article_id = db.Column(db.Integer, db.ForeignKey('article.id', ondelete='CASCADE'))
article = db.relationship('Article', backref=db.backref('answer_set'))
user_id = db.Column(db.String(255), nullable=False)
name = db.Column(db.String(255), nullable=False)
content = db.Column(db.Text(), nullable=False)
create_date = db.Column(db.DateTime(), nullable=False)
update_date = db.Column(db.DateTime(), nullable=True)

当我每20次请求api时,我会得到这个错误

sqlalchemy.exc.TimeoutError: QueuePool limit of size 10 overflow 10 reached, connection timed out, timeout 30.00 (Background on this error at: https://sqlalche.me/e/14/3o7r)

以下是我试图解决的错误。

  1. 为db.rerelationship提供惰性选项。但不起作用
  2. db.session.close((。但它会产生另一个错误

sqlalchemy.orm.exc.DetachedInstanceError: Parent instance <Article at 0x1772756baf0> is not bound to a Session; lazy load operation of attribute 'answer_set' cannot proceed

  1. debug=错误。它也不起作用

我该如何克服这个问题?

+++

当我删除模型中的article = db.relationship('Article', backref=db.backref('answer_set'))和在返回模板之前添加CCD_ 4,它不会出错,但我需要它。

我该怎么办?

+++++回复评论@branco

我只是在使用烧瓶sqlalchemy分页方法。https://flask-sqlalchemy.palletsprojects.com/en/2.x/api/

我正在app.py 上运行这个应用程序

from flask import Flask
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
from flask_jwt_extended import JWTManager
import config
db = SQLAlchemy()
migrate = Migrate()
def create_app():
app = Flask(__name__)
app.secret_key = 'secret_key_for_flash'
app.config.from_object(config)
db.init_app(app)
migrate.init_app(app, db)
from models.user import User
from models.article import Article
from models.answer import Answer
from blueprints.main import main
from blueprints.login import login
from blueprints.register import register
from blueprints.board.board import board
from blueprints.board.article import article
from blueprints.board.answer import answer
app.register_blueprint(main)
app.register_blueprint(login)
app.register_blueprint(register)
app.register_blueprint(board)
app.register_blueprint(article)
app.register_blueprint(answer)
app.config['JWT_SECRET_KEY'] = 'jwt_secret_key'
app.config['JWT_ACCESS_TOKEN_EXPIRES'] = config.expires_access
app.config['JWT_REFRESH_TOKEN_EXPIRES'] =     config.expires_refresh
app.config['JWT_TOKEN_LOCATION'] = ['cookies']
JWTManager(app)
return app

if __name__ == '__main__' :
create_app().run(debug=True)
最后,我解决了这个问题。我只是给了db.rerelationship一些懒惰的选择,但没有奏效。我不得不像一样给db.backref一个懒惰的选项
article = db.relationship('Article', backref=db.backref('answer_set', lazy='joined'))

并添加

db.session.close()

在我调用了分页方法之后

最新更新