我部署时只有Sqlite3.DatabaseError

时间:2017-11-06 16:40:39

标签: python sqlite

简介

我正在开发一个在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;

我很高兴听到你是否知道这可能来自哪里。

1 个答案:

答案 0 :(得分:2)

一件小事,它可能无法解决您的具体问题,但在致电path.abspath之前,您应始终在__file__ 上致电path.dirname,否则您可以根据代码的导入/加载/运行方式获得不可预测的结果

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