Sqlite数据库不一致地仅返回表中的某些行

时间:2018-08-22 08:11:30

标签: android python sqlite

我正在Android手机上运行基于Python的系统。该数据库位于Sqlite3中。它已经运行了大约五年,运行良好,已安装了各种升级的电话,更改了系统等等。

但是,在最后一周左右,系统中出现了一个非常特殊的问题。系统上的一张表称为“发票”,目前其中大约有21,500条记录。但是,使用sqlite3模块从电话上的Python读取数据库将突然仅返回大约2,400条记录。如果我将数据库复制到PC上并通过Linux在Python中打开,同一件事将发生一两次。如果我随后使用命令行sqlite3工具将其打开,则该表将正确读取。之后,它也将在Python中正确开始工作。如果我将同一个数据库复制回手机,它也可以在那里正常工作-大约需要三到四个小时(即,按照我程序的通常运行频率,大约90至120次读/写)。然后问题会再次出现。

我已经更换了手机,以防万一这是手机内存中的问题,但这没有帮助。我也正在有问题的sqlite3数据库上运行vacuum,但无济于事。数据库中似乎没有任何其他明显的错误。

这种行为的原因可能是什么?

编辑按照下面的要求,我发布了一些我用来读取数据库的代码。已经删去了一些无关紧要的内容,因此您可能会看到未定义的变量等。但是我很确定这不是代码,因为相同的代码已经运行了好几年了。

def sqlite_exec(sqlcommand, dbname, inserttable = "", insertstuff = None, returndict = 0, override_stop = False, returncheck = False, nojournal = False, onlyjournal = False):
    #...
    if sqlcommand == "insert":
        # Substitute single quotes with double quotes in input text to avoid sqlite syntax errors
        actual_command = "INSERT INTO {0} ({1}) VALUES ({2});".format(inserttable, ", ".join(insertstuff.keys()), ", ".join(["'" + re.sub("'",'"',valuetext) + "'" for valuetext in insertstuff.values()]))
    else:
        actual_command = sqlcommand
    conn = sqlite3.connect(dbname,timeout = 40.0,isolation_level=None, detect_types=sqlite3.PARSE_DECLTYPES)
    if returndict:
        # Using the sqlite module documentation example; this happens to be better suited for our purposes than the sqlite.Row object
        def dict_factory(cursor, row):
            d = dict((col[0],row[idx]) for idx,col in enumerate(cursor.description))
            return d
        conn.row_factory = dict_factory
    sqliteobj = conn.cursor()
    # ...
    if not onlyjournal:
        try:
            sqliteobj.execute(actual_command)
        # except...
    return sqliteobj

0 个答案:

没有答案