我正在使用带有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中定义了我的表。
答案 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)
现在它工作正常,但我仍然不知道早期版本中的问题是什么。无论是否有上下文管理器,它们似乎都是相同的