【问题标题】:web2py database always locked when trying to update from code尝试从代码更新时,web2py 数据库总是被锁定
【发布时间】: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 中定义。请张贴作为答案。不知道为什么它有时会起作用..但很明显,如果我再次启用该行,它会给出锁定错误。

标签: python web2py


【解决方案1】:

检查你的机器上是否没有其他连接(到sqlite db)打开,如果web2py shell打开,关闭它。

检查 DAL 是否仅定义一次。仅在models/db.py 中定义 DAL,无需在控制器中再次定义。

模型中定义的每个变量在控制器中都是可见的。

您必须在models/db.py 中定义DAL,并且您在控制器中再次定义,因此您为SQLite db 打开了两个连接。这就是您收到错误“database is locked”的原因。

【讨论】:

    【解决方案2】:

    我的建议是

    1.当你进行一些更改时,首先保存代码。

    2.Aftr 保存你的新代码尝试重新加载 web2py.exe 然后运行 ​​web2py,这样你就不会得到 Databaselocked 错误。

    3.之前不要在Sqlite数据库中创建表。

    4.一旦你开始运行 web2py 并启动服务器,当你将数据输入表单时,它会自动在 sqlite 数据库中创建表。

    【讨论】:

    • 1.好的,2. 尝试过,没有区别 3. 从 db.py 中删除了 db.define_table(),有趣的是仍然给出了数据库锁定错误,即使数据库甚至不存在.. (数据库管理员看不到它) 4. 提交 SQL 表单正确保存到数据库,没有错误..
    【解决方案3】:

    尝试使用myRecord 而不是Record,因为它可能是保留字。
    我知道User 在 web2py 中给人们带来了问题。我只是倾向于远离非常通用的别名。

    否则,数据库中是否有任何内容?如果它是空的,您会收到错误消息。
    可能会更好:

    myRecord = record = db(db.mytest).select().first()
    
    if myRecord:
      myRecord.update_record(name="asdfg")
    else:
      [insert statement here]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      相关资源
      最近更新 更多