尝试从代码更新时,web2py 数据库始终处于锁定状态
web2py database always locked when trying to update from code
尝试简单地更新数据库中的现有行(运行 在 web2py 上),
但总是出现数据库锁定错误..
错误信息:
<class 'sqlite3.OperationalError'> database is locked
我的设置
in models/db.py 我创建了数据库,它在使用数据库管理时工作(可以使用 web 界面插入、更新)
db.define_table('mytest', 字段('name', 'string'))
我已经使用 Web 界面向 mytest 添加了 1 行(因此它不是空的)
in controllers/test.py 我有简单的代码来获取第一项并尝试更新值,但它失败了(我打开页面是浏览器,它给出了内部错误, link 到错误日志)
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
- 运行 win2py.py (2.14.6) 手动使用 Spyder ide
- windows8
到目前为止我尝试了什么
- 不同的 DAL 设置,池大小,没有自动导入..
- 关闭所有 web2py 管理 tools/tabs
- 创建新数据库
- 重启 web2py
- 重启电脑
错误日志:http://pastebin.com/2WMWypt6
当前解决方法:
- 创建新应用程序,完全相同的代码似乎在那里工作
解决方案是: @GauravVichare
- 从控制器中删除此行(它已在 db.py 中定义)
db = DAL('sqlite://storage.sqlite',pool_size=10,auto_import=True)
尝试使用 myRecord
而不是 Record
,因为它可能是保留字。
我知道 User
在 web2py 中给人们带来了问题。我只是倾向于远离非常通用的别名。
否则,数据库中当前是否有任何内容?如果它是空的,你会收到错误消息。
可能更好:
myRecord = record = db(db.mytest).select().first()
if myRecord:
myRecord.update_record(name="asdfg")
else:
[insert statement here]
我的建议是
1.First 全部在您进行一些更改时保存代码。
2.Aftr 保存你的新代码尝试重新加载 web2py.exe
然后 运行 web2py 这样你就不会得到 Databaselocked 错误。
3.Dont 以前在 Sqlite 数据库中创建过表。
4.once 你启动 运行ning web2py 并启动服务器,当你在表单中输入数据时,它会自动在 sqlite 数据库中创建表格。
检查您的机器上是否没有其他连接(到 sqlite 数据库)打开,如果 web2py shell 打开,请关闭它。
检查DAL是否只定义一次。仅在models/db.py
中定义DAL,无需在controller中重新定义。
模型中定义的每个变量在控制器中都是可见的。
您必须在 models/db.py
中定义了 DAL
,并且您正在控制器中再次定义,因此您为 SQLite db
打开了两个连接。这就是您收到错误“database is locked
”的原因。
尝试简单地更新数据库中的现有行(运行 在 web2py 上), 但总是出现数据库锁定错误..
错误信息:
<class 'sqlite3.OperationalError'> database is locked
我的设置
in models/db.py 我创建了数据库,它在使用数据库管理时工作(可以使用 web 界面插入、更新)
db.define_table('mytest', 字段('name', 'string'))
我已经使用 Web 界面向 mytest 添加了 1 行(因此它不是空的)
in controllers/test.py 我有简单的代码来获取第一项并尝试更新值,但它失败了(我打开页面是浏览器,它给出了内部错误, link 到错误日志)
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
- 运行 win2py.py (2.14.6) 手动使用 Spyder ide
- windows8
到目前为止我尝试了什么
- 不同的 DAL 设置,池大小,没有自动导入..
- 关闭所有 web2py 管理 tools/tabs
- 创建新数据库
- 重启 web2py
- 重启电脑
错误日志:http://pastebin.com/2WMWypt6
当前解决方法: - 创建新应用程序,完全相同的代码似乎在那里工作
解决方案是: @GauravVichare - 从控制器中删除此行(它已在 db.py 中定义)
db = DAL('sqlite://storage.sqlite',pool_size=10,auto_import=True)
尝试使用 myRecord
而不是 Record
,因为它可能是保留字。
我知道 User
在 web2py 中给人们带来了问题。我只是倾向于远离非常通用的别名。
否则,数据库中当前是否有任何内容?如果它是空的,你会收到错误消息。
可能更好:
myRecord = record = db(db.mytest).select().first()
if myRecord:
myRecord.update_record(name="asdfg")
else:
[insert statement here]
我的建议是
1.First 全部在您进行一些更改时保存代码。
2.Aftr 保存你的新代码尝试重新加载 web2py.exe 然后 运行 web2py 这样你就不会得到 Databaselocked 错误。
3.Dont 以前在 Sqlite 数据库中创建过表。
4.once 你启动 运行ning web2py 并启动服务器,当你在表单中输入数据时,它会自动在 sqlite 数据库中创建表格。
检查您的机器上是否没有其他连接(到 sqlite 数据库)打开,如果 web2py shell 打开,请关闭它。
检查DAL是否只定义一次。仅在models/db.py
中定义DAL,无需在controller中重新定义。
模型中定义的每个变量在控制器中都是可见的。
您必须在 models/db.py
中定义了 DAL
,并且您正在控制器中再次定义,因此您为 SQLite db
打开了两个连接。这就是您收到错误“database is locked
”的原因。