python - sqlite同时多次写入

标签 python sqlite flask python-requests flask-sqlalchemy

我正在用 sqlite 数据库制作一个 python Flask 应用程序
有没有办法为写请求创建一个队列,以便它可以顺利运行,因为 SQLITE 不支持多个并发写入或提交

这是我的连接字符串

engine = create_engine('sqlite:///IT_DataBase.db',
                       connect_args={'check_same_thread': False})
Base.metadata.bind = engine
DBSession = sessionmaker(bind=engine)
session = DBSession()

这是作为示例的提交代码:
@app.route('/NewRequest', methods=['GET', 'POST'])
@login_required
def NewRequest():
    connUser=session.query(User).filter(User.id==Session.get('user_id')).one()
    if request.method == 'GET':
        Types = session.query(Req_Type.id,Req_Type.Type_name)
        Pr = session.query(Req_Priorities.id,Req_Priorities.Priority_name)
        return render_template('NewRequest.html',conn=connUser ,name=current_user.name, items=Types,priorities=Pr)
    else:
        name= request.form['Name']
        Description= request.form['Description']
        Type = request.form.get('Type')
        Priority = request.form.get('Priority')
        newRequest = Requests(name=name, Record_Created=datetime.now().strftime("%Y-%m-%d %H:%M"), Description=Description, Assigned_To=None, Type_Name=str(Type), Priority_Name=str(Priority), Status_Name='Opened', User_ID=Session.get('user_id') )
        session.add(newRequest)
        flash('New Request With Name %s Successfully Created' % newRequest.name)
        session.commit()
        UserRequests= session.query(Requests).filter_by(User_ID=Session.get('user_id')).filter(Requests.Status_Name!='Solved').all()
        return render_template('ReqData.html',conn=connUser , title='User Requests', rows=UserRequests)


我认为,如果我们不更改数据库引擎,解决方案要么是将提交排队,但我不知道如何
或者在提交之前让 flask 等待随机时间,但我认为这会使性能变差
我该怎么办

最佳答案

您需要序列化提交。创建一个如下所示的锁。

from threading import RLock

sql_lock = RLock()

像下面这样包装 session.add 和 session.commit。 lock.acquire()将在另一个线程获取锁但尚未释放锁时阻塞代码。这确保在 acquire() 之间只有一个线程(或没有线程)正在运行和 release()每时每刻。
    try:
        sql_lock.acquire()
        session.add(newRequest)
        session.commit()
    finally:
        sql_lock.release()

关于python - sqlite同时多次写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59588358/

相关文章:

python - 在 train_test_split 中使用 'stratify' 没有什么区别。它是干什么用的?

python - 如何将类的实例作为参数传递给装饰类中定义的实例方法的装饰器?

php - 了解: From PHP Array to Python?

python - 来自邻接表的嵌套 JSON

python - 使用 FFT Python 从音频信号中去除背景噪声

iphone - FMDB中的ResultSet列数

sql - SQLite数据库将字符串转换回blob

搜索sqlite3数据库时的Python错误

python - 更新 MySQL 中的行,无需 ORM

python - Windows 提示输入用户名和密码