Python 仅在部署时发生Sqlite3.DatabaseError 介绍

Python 仅在部署时发生Sqlite3.DatabaseError 介绍,python,sqlite,Python,Sqlite,我正在开发一个运行在Flask上的python Web应用程序。我开发的一个模块使用sqlite3访问我的一个项目目录中的数据库文件。在本地,它就像一个符咒,但我有问题使它在pythonywhere上正常运行 密码 下面是对我的模块_database.py的深入了解,这两个sql查询都是仅选择的: 导入sqlite3 导入操作系统 PATH_DB=os.PATH.joinos.PATH.dirname__文件_,‘res/database.DB’ db=sqlite3.connectPATH\u

我正在开发一个运行在Flask上的python Web应用程序。我开发的一个模块使用sqlite3访问我的一个项目目录中的数据库文件。在本地,它就像一个符咒,但我有问题使它在pythonywhere上正常运行

密码 下面是对我的模块_database.py的深入了解,这两个sql查询都是仅选择的:

导入sqlite3 导入操作系统 PATH_DB=os.PATH.joinos.PATH.dirname__文件_,‘res/database.DB’ db=sqlite3.connectPATH\u db cursor=db.cursor def初始化: cursor.executemy\u sql\u查询 val=cursor.fetchone def流程: cursor.executeanother\u sql\u查询 另一个值=cursor.fetchone 我不知道这是否重要,但我的模块是这样导入的:

从导入lib导入模块 模块=导入模块溶质路径到模块 module.init module init 之后,我的网络应用程序将定期调用:

module.process()
因此,我在init中有一个对db的访问权限,在进程中有一个对db的访问权限。当我在本地运行它时,两者都可以工作

问题 我通过Pythonywhere上的github提取了代码,重新启动了应用程序,我可以在日志文件中看到init中对DB的访问有效。我打印了一个值,工作正常

但是,当我的应用程序调用process方法时,我得到了一个:

2017-11-06 16:27:55,551:   File "/home/account-name/project-name/project_modules/module_database.py", line 71, in my_method
2017-11-06 16:27:55,551:     cursor.execute(sql)
2017-11-06 16:27:55,552: sqlite3.DatabaseError: database disk image is malformed
我尝试通过控制台运行完整性检查:

PRAGMA integrity_check;
它打印的很好


我很高兴听到您是否知道这可能来自何处。

一件小事,它可能无法解决您的特定问题,但在调用path.dirname之前,您应该始终在_文件上调用path.abspath,否则您可能会得到不可预知的结果,这取决于您的代码的导入/加载/运行方式

PATH_DB = os.path.join(
    os.path.dirname(os.path.abspath(__file__)),
    'res/database.db'
)

这是一件小事,它可能无法解决您的特定问题,但您应该在调用path.dirname之前始终在_文件上调用path.abspath,否则您可能会根据代码的导入/加载/运行方式得到不可预测的结果

PATH_DB = os.path.join(
    os.path.dirname(os.path.abspath(__file__)),
    'res/database.db'
)

我认为您可能需要在每次调用init和process时创建一个新的游标。我不这么认为。IIRC只要不执行嵌套查询,就可以保留相同的游标,并在需要时执行它。为什么它可以在本地工作,但不能在Python上工作?明天我仍然会尝试你的想法。关于本地和远程环境以及如何进行测试,你说的还不够多,但我想在多线程环境中使用全局游标对象与此有关。据我所知,Flask dev服务器默认为单线程,这就是它可能在本地工作而不是在部署时工作的一个原因。明天早上我将运行一些测试。谢谢你的建议。我会让你保持更新我想你可能需要在每次调用init和process时创建一个新的游标,我不这么认为。IIRC只要不执行嵌套查询,就可以保留相同的游标,并在需要时执行它。为什么它可以在本地工作,但不能在Python上工作?明天我仍然会尝试你的想法。关于本地和远程环境以及如何进行测试,你说的还不够多,但我想在多线程环境中使用全局游标对象与此有关。据我所知,Flask dev服务器默认为单线程,这就是它可能在本地工作而不是在部署时工作的一个原因。明天早上我将运行一些测试。谢谢你的建议。我会随时告诉你最新情况