【问题标题】:flask-sqlalchemy timeouterror by queuepool overflow using backref option使用 backref 选项的 queuepool 溢出烧瓶-sqlalchemy timeouterror
【发布时间】:2021-12-31 22:20:32
【问题描述】:

我是 flask-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.relationship 提供惰性选项。但不起作用
  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. 调试=假。它也不起作用。

我该如何解决这个问题?

+++

当我删除 article = db.relationship('Article', backref=db.backref('answer_set')) 来自模型和 在返回模板前添加db.session.close(), 它不会出错,但我需要它。

我该怎么办?

+++++ 评论@branco 的答案

我只是使用flask-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)

【问题讨论】:

  • 您似乎在使用烧瓶分页扩展?发布您的扩展或如何定义分页功能。还要发布初始化烧瓶、sqlalchemy 和扩展的部分。

标签: python flask sqlalchemy flask-sqlalchemy


【解决方案1】:

最后,我解决了这个问题。我只是给 db.relationship 提供了惰性选项。但没有用。我不得不给 db.backref 提供惰性选项。喜欢

article = db.relationship('Article', backref=db.backref('answer_set', lazy='joined'))

并添加

db.session.close()

在我调用分页方法之后

【讨论】:

    猜你喜欢
    • 2018-04-14
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2016-09-29
    • 2016-11-12
    • 2020-02-20
    • 2014-07-20
    相关资源
    最近更新 更多