我有一个基于flask的Web应用程序,它使用Flask-SQLAlchemy
进行数据库交互(MySQL
)。该数据库存储多个传感器数据的日期时间/值对(10k或更多),用户可以在前端显示这些数据。
当用户决定删除传感器时,必须删除所有日期时间/值对。为了使网站保持响应状态,我在数据库中设置了删除标志,该标志应由后台线程收集,然后将其删除。
我实例化了一个全局sqlalchemy
数据库对象,如下所示:
global_object.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
然后在应用程序工厂中,我导入了该数据库对象并对其进行了初始化:
factory.py
from flask import Flask
from global_object import db
from backgroundWatch import backgroundWatch
def create_app():
app = Flask(__name__)
# app configuration here...
db.init_app(app)
background = backgroundWatch(app)
background.run()
return app
然后在backgroundWatch中导入数据库对象并在应用程序上下文中执行数据库操作:
backgroundWatch.py
from global_object import db
import threading
import time
from Datamodel import Sensors
class backgroundWatch(threading.Thread):
def __init__(self, app):
self.app = app
self.sleep_timeout = 60
def run(self):
while True:
with self.app.app_context():
deletes = db.session.query(Sensors).filter_by(delete=1).all()
if len(deletes) > 0:
for delete_obj in deletes:
db.session.delete(delete_obj)
db.session.commit()
在所有蓝图中,我还导入了该db对象并进行了数据库交互。
问题是,当删除发生时,需要数据库访问的用户请求不会得到处理。我认为这是因为我正在使用相同的数据库会话。但是,我真的不知道该如何更改,或者实际上什么是正确的方法。
您能否给我一些有关如何正确执行此操作的提示,以便前端保持响应状态?
非常感谢!