【发布时间】:2016-05-26 07:30:04
【问题描述】:
尝试简单地更新数据库中的现有行(在 web2py 上运行), 但总是出现数据库锁定错误..
错误信息:
<class 'sqlite3.OperationalError'> database is locked
我的设置
-
在 models/db.py 中我创建了数据库,它在使用数据库管理时工作(可以使用 Web 界面插入、更新)
db.define_table('mytest', Field('name', 'string'))
我在 mytest 中添加了 1 行,使用 Web 界面(所以它不是空的)
-
在 controllers/test.py 我有简单的代码来获取第一个项目并尝试更新值,但它失败了(我打开页面是浏览器,它给出了内部错误,并带有指向错误日志的链接)
def index(): # connect db = DAL('sqlite://storage.sqlite',pool_size=10,auto_import=True) # get first record record = db(db.mytest).select().first() # try to update it.. database locked error here record.update_record(name="asdfg") # just in case needed? db.commit() db.close() return "test"
软件
- WinPython2.7
- 使用 Spyder ide 手动运行 win2py.py (2.14.6)
- windows8
到目前为止我已经尝试过什么
- 不同的 DAL 设置、池大小、没有自动导入..
- 关闭所有 web2py 管理工具/选项卡
- 创建新数据库
- 重启 web2py
- 重启电脑
错误日志:http://pastebin.com/2WMWypt6
当前解决方法: - 创建新应用程序,完全相同的代码似乎在那里工作
解决方案是: @GauravVichare - 从控制器中删除这一行(它已经在 db.py 中定义)
db = DAL('sqlite://storage.sqlite',pool_size=10,auto_import=True)
【问题讨论】:
-
请发布错误日志!
-
@GauravVichare 在帖子中添加了指向错误日志的链接(行号从复制粘贴和删除 cmets 后有点偏离)
-
检查你的机器上是否没有其他连接(到sqlite db)打开,如果web2py shell打开,关闭它。检查 DAL 是否仅定义一次。只在models/db.py中定义DAL,不需要在controller中定义。模型中定义的每个变量在控制器中都是可见的。您必须在 models/db.py 中定义了 DAL,并且您在控制器中再次定义,这就是您收到错误“db locked”的原因
-
@GauravVichare 就是这样!删除行 db = DAL()... 并且它有效。是的,默认情况下,db 已经在 db.py 中定义。请张贴作为答案。不知道为什么它有时会起作用..但很明显,如果我再次启用该行,它会给出锁定错误。