Python 3.5 SQLite INSERT第一轮但不是第二轮?

时间:2016-11-15 13:12:07

标签: python-3.x sqlite insert

我有一个脚本,它读取文件夹结构的内容,并将每个文件信息和每个文件的信息插入到SQLite数据库(不同的表)中。

扫描时,首先检查目录是否已被扫描。如果不是,则添加目录信息(路径和最后修改的数据)并继续扫描内容。如果先前已扫描过目录,并且自上次扫描后目录尚未修改,则会忽略该目录,并且脚本将在下一个目录上移动。但是,如果先前已扫描过目录,但保存在数据库中的此目录的最后修改信息显示自上次扫描以来已经进行了修改,则数据库文件信息条目擦除此文件夹并更新目录信息以显示新更新的最新修改数据 - 之后脚本进入该文件夹以处理此目录中包含的所有文件。

插入数据按如下方式完成:

def executeQuery(conn, cursor, sqlstring, values):
    try:
        cursor = getCursor()
        cursor.execute(sqlstring, values)
        conn.commit()
    finally:
        cursor.close()

sqlstring = "INSERT INTO FILEDATA (fullpathandfilename, filename, filepath, scandate) VALUES (?,?,?,?)"
values = (fullpathandfilename,filename,filepath, scandate)
executeQuery(conn, cursor, sqlstring, values)

我看到了一些非常奇怪的行为。目录数据正在正确写入和更新。在第一次扫描期间(即第一次扫描目录时)正确写入文件信息但是如果在某个时刻重新扫描目录,因为自上次记录扫描以来目录最后修改日期已更改,似乎是(fullpathandfilename,filename,filepath,scandate)的相同数据被送到同一个函数,该函数没有失败(在try中除了块之外没有到达代码) - 但实际记录没有到达数据库

这对我来说非常奇怪,因为基本上完全相同的参数将完全相同的功能但具有不同的结果。

为什么会发生这种情况?

1 个答案:

答案 0 :(得分:0)

我能够解决在包含db相关代码的模块中创建单个连接和游标对象的问题,并将连接/游标对象的数量减少到一个。以前他们是在两个不同的模块中创建的(我知道的菜鸟错误)。

最终看起来像这样:

'''
db.py
'''

conn =  sqlite3.connect(databaseName)
cursor = conn.cursor()


def executeQuery(sqlstring, values):
    try:
        cursor.execute(sqlstring, values)
        conn.commit()
    finally:
        cursor.close()


'''
anotherModule.py
'''

    sqlstring = "INSERT INTO FILEDATA (fullpathandfilename, filename, filepath, scandate) VALUES (?,?,?,?)"
    values = (fullpathandfilename,filename,filepath, scandate)
    executeQuery(sqlstring, values)