SQLite:数据库被锁定

时间:2017-12-08 08:36:06

标签: python sqlite flask database-connection flask-sqlalchemy

我正在使用带有sqlalchemy和sqlite db的烧瓶。我有2个ajax,它将一些数据从html发送到我的.py文件。

问题是每当我执行这两个操作中的任何一个时,第二个操作由于数据库的锁定而变得不可用。此外,如果首先选择的操作将被删除,那么无论何时操作将被选择异常触发。首先选择添加,我们可以添加没有限制,这也很奇怪,因为功能似乎相似。

我尝试了超时,以不同的方式结束会话,结果总是一样。

以下是两个函数处理程序:

app = Flask(__name__)
csrf = CSRFProtect(app)

app.config.from_object('config')
db = SQLAlchemy(app)

import forms
import models


@app.route('/delete', methods = ['GET', 'POST'])
def delete():
    if request.method == "POST":
        if request.form['type'] == "delete":
            print("delete")
            engine = create_engine(SQLALCHEMY_DATABASE_URI)
            Session = sessionmaker(bind=engine)
            session = Session()

            try:
                print("try")
                requested = request.form['id']
                print(requested)
                models.Income.query.filter(models.Income.id == requested).delete()
                session.commit()
            except:
                print("rollback")
                session.rollback()
            finally:
                print("fin")
                session.close()

            ellist = models.Income.query.all()
            return render_template("incomeSection.html", list=ellist)


@app.route('/add', methods=['GET', 'POST'])
def add():
    if request.method == "POST":
        if request.form['type'] == "add":
            print('add')
            engine = create_engine(SQLALCHEMY_DATABASE_URI)
            Session = sessionmaker(bind=engine)
            session = Session()

            try:
                print("try")
                newItem = models.Income(name=request.form['name'], tag=request.form['tag'],
                                        account=request.form['account'],
                                        date=date(*(int(i) for i in request.form['date'].split("-"))))
                session.add(newItem)
                session.commit()
            except:
                print('rollback')
                session.rollback()
            finally:
                print("fin")
                session.close()

            ellist = models.Income.query.all()
            print(ellist)
            return render_template("incomeSection.html", list=ellist)

我已经读过这个由非关闭连接引起的异常,但我在每个finally块中都有.close()。我认为问题可能是因为db = SQLAlchemy(app),但我不知道如何解决这个问题。因为我使用这个变量来连接form.py中的db,其中我有表单模板,在models.py中我在db中定义了我的表。

1 个答案:

答案 0 :(得分:0)

所以,很明显,thete是连接数量的问题。 解决了我的问题的是sqlalchemy的上下文管理器,我使用了这个:

class SQLAlchemyDBConnection(object):

def __init__(self, connection_string):
    self.connection_string = connection_string
    self.session = None

def __enter__(self):
    engine = create_engine(self.connection_string)
    Session = sessionmaker()
    self.session = Session(bind=engine)
    return self

def __exit__(self, exc_type, exc_val, exc_tb):
    self.session.commit()
    self.session.close()

并在处理程序中

with SQLAlchemyDBConnection(SQLALCHEMY_DATABASE_URI) as db:
            newItem = models.Income(*your params*)
            db.session.add(newItem)

现在它工作正常,但我仍然不知道早期版本中的问题是什么。无论是否有上下文管理器,它们似乎都是相同的