python 关闭不了mysql_关于python:Flask SQLAlchemy不会关闭MySQL数据库连接

我有一个使用Flask-SQLAlchemy和MySQL数据库的Flask应用程序,其中的db定义如下:

db.py:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

main.py:

from db import db

app = Flask(__name__)

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

app.config['SQLALCHEMY_DATABASE_URI'] ="mysql+pymysql://" + \

DB_USERNAME +":" + DB_PASSWORD +"@" + DB_HOST +"/" + DB_DATABASE

db.init_app(app)

@app.teardown_appcontext

def teardown_db(error):

db.session.close()

db.engine.dispose()

user.py:

class User(db.Model):

id = db.Column(db.Integer, primary_key=True)

username = db.Column(db.String(80), unique=True, nullable=False)

email = db.Column(db.String(120), unique=True, nullable=False)

我使用模型查询数据库,该模型使用db.engine.execute()在需要的地方编写原始SQL查询,或者使用集成的Flask-SQLAlchemy API读取数据,例如User.query.filter_by().all()。

我使用以下命令将新数据写入数据库:

new_user_entry = User(username ="abc", email ="abc@example.com")

db.session.add(new_user_entry)

db.session.commit()

我正在使用show processlist监视我的MySQL服务器,并且我注意到对于我遇到的每个单个请求,数据库连接都保持增加2的速度。 仅当我停止Flask进程时,数据库连接才似乎重置。 随着时间的流逝,MySQL服务器会引发以下错误:

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

我正在使用带有2个工作进程的gunicorn和gevent / eventlet服务该应用程序。 我使用python3。

我在这里想念什么吗? 我尝试结束数据库会话并处理引擎,但这似乎不起作用。

您如何查询数据库?请张贴...

检查在后台进程中启动的APScheduler。它可能仍在使用连接到数据库的会话,而不释放它们。虽然我对Flask的经验很少,但是一般的经验法则是(无论哪种编程语言或框架)-尝试在会话之间重用/共享连接。

@DinkoPehar用我访问数据库的各种方式更新了该问题。

抱歉,我对此不太了解,我以为你没有session.commit()。也许这会帮助flask.pocoo.org/docs/1.0/appcontext/#storing-data。祝好运

@DinkoPehar我尝试了提供的解决方案,但无法绕过初始化的db.init_app(app)。

我还不知道更多,但是如果您有2个工作程序,请检查eventlet / gevent,他们是否提交所有事务,或对它们设置超时eventlet.net/doc/basic_usage.html#eventlet.Timeout。我认为一个工人不会承诺并重新分配资源。

有趣的是,即使使用开发版本(没有gunicorn或gevent / eventlet),我也会注意到连接累积。

我终于找到了解决上述问题的方法。

我使用了此处定义的声明性模型,而不是遵循此处给出的Flask-SQLAlchemy的快速入门文档。

更改的文件如下:

db.py:

from sqlalchemy import create_engine

from sqlalchemy.orm import scoped_session, sessionmaker

from sqlalchemy.ext.declarative import declarative_base

engine = create_engine(DB_URI, convert_unicode=True)

db_session = scoped_session(sessionmaker(autocommit=False,

autoflush=False,

bind=engine))

Base = declarative_base()

Base.query = db_session.query_property()

def init_db():

import user

Base.metadata.create_all(bind=engine)

main.py:

from db import init_db, db_session

init_db()

@app.teardown_appcontext

def shutdown_session(exception=None):

db_session.remove()

user.py:

from sqlalchemy import Column, Integer, String

from data_models.db import Base

class User(Base):

id = db.Column(Integer, primary_key=True)

username = db.Column(String(80), unique=True, nullable=False)

email = db.Column(String(120), unique=True, nullable=False)

要查询记录,我们可以使用User.query.filter_by().all()或db_engine.execute()。

要将新数据写入数据库,我们可以使用以下方法:

new_user_entry = User(username ="abc", email ="abc@example.com")

db_session.add(new_user_entry)

db_session.commit()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值