我已经决定我不喜欢Mendeley提供的自动归档和重命名,但是发现它跟踪了我可以从Python轻松阅读和修改的sqlite数据库中的所有内容。
我的问题是,如果我要迭代包含文件路径和哈希的表的行,这些表用作数据库中其他地方使用的标识符,那么用于更新路径的适当模式是什么我继续前进,检查文件是否需要重命名,然后在移动文件时更新数据库中的行。
我开始整理一些Python来做这件事,但在我看来,我可能需要事先进行查询以获取我将要稍后迭代的所有行,然后再执行REPLACE或UPDATE语句文件我决定搬家。
我不熟悉sqlite3模块的内部结构,但我认为在迭代用于原始选择的光标时执行REPLACE / UPDATE是个坏主意。
还有其他方法可以不需要返回REPLACE / UPDATE吗?我确实需要从其他表中进行查询,使用文件哈希来获取一些其他元数据以构建重命名。
答案 0 :(得分:2)
我认为除了通过SQL-UPDATE或INSERT OR REPLACE之外,还有一种方法可以修改表中的行。 (很有可能认为sqlite3.Row对象可能允许赋值,并写回它所代表的行,但不是。)
至于UPDATEs(通过第二个光标),而原始SELECT有一个未完成的光标 - 你会问这是不是一个坏主意 - 我不知道你是否担心正确性或性能(正确性:光标变得混乱,并且不会迭代它应该完全一次的所有行;性能:光标会迭代它应该完全一次的所有行但是有一堆昂贵的额外查询)?
WRT正确性,这似乎工作正常 - 我只是做了一个快速测试,我创建了两个游标,c1和c2,然后在c1上执行了一个SELECT命令,然后在c2上执行了一个影响相同行的UPDATE命令,然后看了c1.fetchall()的结果。它仍然包含所有正确的行,尽管第一行中的数据是陈旧的(可能是使用初始查询获取的),后面行中的数据已更新(可能仅在更新后使用fetchall获取)。
(另外,如果c2上的UPDATE影响了c1上SELECT将返回哪些记录,那么将不再提取这些记录,但显然已经提取了所有已经提取的记录,并且cursor.execute()似乎再次立即获取第一条记录,因此使用与上面相同的命令顺序并使用UPDATE命令使原始SELECT找不到任何内容,后面的c1.fetchall()仍返回一条记录。)
至于性能,我不知道 - 从上一段开始,我认为它必须重复查询,根据查询,这可能会或可能不会很昂贵。 (它可能不是字面上重复它;也许这项工作推迟到实际获取。)
简短的故事:如果没有UPDATE或REPLACE,我认为还有另一种方法可以做到这一点,而且我认为即使在原始光标上进行迭代也可以正常进行这些UPDATE。