flask-sqlalchemy timeouterror 通过使用 backref 选项的队列溢出
flask-sqlalchemy timeouterror by queuepool overflow using backref option
我是 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)
这是我尝试解决的错误。
- 为 db.relationship 提供惰性选项。但不起作用
- 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
- 调试=假。也不行。
我怎样才能克服这个问题?
+++
当我删除
article = db.relationship('Article', backref=db.backref('answer_set'))
来自模型和
在 return 模板之前添加 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)
终于,我解决了这个问题。我只是给了 db.relationship 懒惰的选项。但没有用。我不得不给 db.backref 懒惰的选项。喜欢
article = db.relationship('Article', backref=db.backref('answer_set', lazy='joined'))
并添加
db.session.close()
调用分页方法后
我是 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)
这是我尝试解决的错误。
- 为 db.relationship 提供惰性选项。但不起作用
- 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
- 调试=假。也不行。
我怎样才能克服这个问题?
+++
当我删除
article = db.relationship('Article', backref=db.backref('answer_set'))
来自模型和
在 return 模板之前添加 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)
终于,我解决了这个问题。我只是给了 db.relationship 懒惰的选项。但没有用。我不得不给 db.backref 懒惰的选项。喜欢
article = db.relationship('Article', backref=db.backref('answer_set', lazy='joined'))
并添加
db.session.close()
调用分页方法后