我有一个在Azure上运行的Flask服务器,由Azure应用服务提供,使用sqlite3作为数据库。我无法更新sqlite3,因为它显示数据库已锁定
2018-11-09T13:21:53.854367947Z [2018-11-09 13:21:53,835] ERROR in app: Exception on /borrow [POST]
2018-11-09T13:21:53.854407246Z Traceback (most recent call last):
2018-11-09T13:21:53.854413046Z File "/home/site/wwwroot/antenv/lib/python3.7/site-packages/flask/app.py", line 2292, in wsgi_app
2018-11-09T13:21:53.854417846Z response = self.full_dispatch_request()
2018-11-09T13:21:53.854422246Z File "/home/site/wwwroot/antenv/lib/python3.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
2018-11-09T13:21:53.854427146Z rv = self.handle_user_exception(e)
2018-11-09T13:21:53.854431646Z File "/home/site/wwwroot/antenv/lib/python3.7/site-packages/flask/app.py", line 1718, in handle_user_exception
2018-11-09T13:21:53.854436146Z reraise(exc_type, exc_value, tb)
2018-11-09T13:21:53.854440346Z File "/home/site/wwwroot/antenv/lib/python3.7/site-packages/flask/_compat.py", line 35, in reraise
2018-11-09T13:21:53.854444746Z raise value
2018-11-09T13:21:53.854448846Z File "/home/site/wwwroot/antenv/lib/python3.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
2018-11-09T13:21:53.854453246Z rv = self.dispatch_request()
2018-11-09T13:21:53.854457546Z File "/home/site/wwwroot/antenv/lib/python3.7/site-packages/flask/app.py", line 1799, in dispatch_request
2018-11-09T13:21:53.854461846Z return self.view_functions[rule.endpoint](**req.view_args)
2018-11-09T13:21:53.854466046Z File "/home/site/wwwroot/application.py", line 282, in borrow
2018-11-09T13:21:53.854480146Z cursor.execute("UPDATE books SET stock = stock - 1 WHERE bookid = ?",(bookid,))
2018-11-09T13:21:53.854963942Z sqlite3.OperationalError: database is locked
路线是这样的-
@app.route('/borrow',methods=["POST"])
def borrow():
# import pdb; pdb.set_trace()
body = request.get_json()
user_id = body["userid"]
bookid = body["bookid"]
conn = sqlite3.connect("database.db")
cursor = conn.cursor()
date = datetime.now()
expiry_date = date + timedelta(days=30)
cursor.execute("UPDATE books SET stock = stock - 1 WHERE bookid = ?",(bookid,))
# conn.commit()
cursor.execute("INSERT INTO borrowed (issuedate,returndate,memberid,bookid) VALUES (?,?,?,?)",("xxx","xxx",user_id,bookid,))
conn.commit()
cursor.close()
conn.close()
return json.dumps({"status":200,"conn":"working with datess update"})
我尝试使用杂注检查数据库完整性。没有完整性损失。我不知道是什么导致了这个错误。任何帮助都是赞赏的:)
5条答案
按热度按时间g52tjvyc1#
我在Linux上的Docker上使用Azure应用服务,也遇到了同样的问题。如果你在Windows上使用Azure应用程序服务,问题与我的不同。
问题是/home被挂载为CIFS文件系统,无法处理SQLite3锁。
我的解决方法是复制db。sqlite3文件到/home以外的某个目录,并正确设置数据库的权限和所有权。sqlite3文件及其目录。然后,让我的项目读/写它。然而,这种变通方法相当尴尬。我不推荐。
o75abkj42#
这个解决方案可能对生产工作负载不安全,但至少我通过执行以下命令使它工作:
运行上述命令后,存储在Azure文件共享上的数据库将在容器Web App中运行。
uubf1zoe3#
我通过设置Azure挂载选项获得了它,配置如下:
但真实的的解决方案是添加标志nobrl(字节范围锁定)。
为kubernetes添加storageclass示例:
v440hwme4#
这个答案出现在这个问题的典型谷歌搜索的顶部,所以我想我应该添加一些额外的提示:
对于那些运行JavaScript并使用Sequelize作为SQLite DB接口的用户,运行
await sequelize.query('PRAGMA journal_mode=WAL;')
将允许您在Linux服务计划下运行的Azure Web应用程序中读取/写入DB文件。我有一个单独的脚本,通过调用
sequelize.sync()
创建一个。我将DB文件存储在Linux容器文件系统中/home下的单独目录中。它似乎运行良好,我的工作量预计将非常轻。请注意,当您的应用启动并尝试连接到数据库时,您不需要再次设置日志模式,该模式将在文件本身中设置(这在SQLite文档中并不明显)。whhtz7ly5#
这个问题对我来说已经消失了。
sqlite3 v5.1。5
Azure Linux开发(S1:(1)
添加了NodeJS Web应用程序,默认设置了所有内容,home仍然作为CIFS装载,可能更改的是mode - 0777: