我正在开发一个在Flask上运行的python webapp。我开发的模块之一使用sqlite3来访问我的一个项目目录中的数据库文件。在本地它就像一个魅力,但我有问题,使它在pythonanywhere上正常运行。
以下是我module_database.py
的洞察(两个sql查询都只有SELECT
):
import sqlite3
import os
PATH_DB = os.path.join(os.path.dirname(__file__), 'res/database.db')
db = sqlite3.connect(PATH_DB)
cursor = db.cursor()
def init():
cursor.execute(my_sql_query)
val = cursor.fetchone()
def process():
cursor.execute(another_sql_query)
another_val = cursor.fetchone()
我不知道这是否重要,但我的模块是这样导入的:
from importlib import import_module
module = import_module(absolute_path_to_module)
module.init() # module init
然后我的webapp会定期致电:
module.process()
因此,我可以在init()
中访问数据库,并在process()
中访问数据库。当我在本地运行时,两者都有效。
我在pythonanywhere上通过github提取我的代码,重新启动应用程序,我可以在日志文件中看到init()
中对数据库的访问工作(我打印一个值,它工作正常)
但是,当我的应用程序调用{{1}}方法时,我得到了一个:
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;
我很高兴听到你是否知道这可能来自哪里。
答案 0 :(得分:2)
一件小事,它可能无法解决您的具体问题,但在致电path.abspath
之前,您应始终在__file__
上致电path.dirname
,否则您可以根据代码的导入/加载/运行方式获得不可预测的结果
PATH_DB = os.path.join(
os.path.dirname(os.path.abspath(__file__)),
'res/database.db'
)