2016-11-15 254 views
0

我有一个脚本,它读取文件夹结构的内容,并将每个目录上的信息和每个文件的信息插入到SQLite数据库(不同的表格)中。Python 3.5 SQLite INSERT第一次工作,但不是第二次?

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

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,文件名,文件路径,scandate)被馈送到相同的函数,它不会失败(在尝试除了块以外,没有达到除外代码) - 但实际记录不会到达数据库。

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

为什么会发生这种情况?

+0

这听起来也许有些事情正在发生与数据库事务。也许它没有被第二次执行或关闭? –

+0

但它们都使用相同的函数,其中包括conn.commit()和cursor.close()。我应该在每次交易之后尝试关闭连接conn.close()吗?现在我只在整个过程结束时调用它... – user3535074

回答

0

我能解决在模块中创建单个连接和游标对象的问题,该模块包含与数据库相关的代码,并将连接/游标对象的数量减少为一个。以前他们是在两个不同的模块中创建的(我认识的新手错误)。

它结束了看起来像这样:

''' 
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) 
相关问题