使用Python检查并更新sqlite中的行

2024-04-30 07:18:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我决定不喜欢Mendeley提供的自动归档和重命名,但发现它可以跟踪sqlite数据库中的所有内容,我可以轻松地从Python中读取和修改这些内容。在

我的问题是,如果我要迭代一个表的行,其中包含文件路径和散列,这些散列是在数据库中其他地方使用的标识符,那么当我移动文件时,使用什么样的模式来更新路径,检查文件是否需要重命名,然后希望在移动文件时更新数据库中的行。在

我开始组装一些Python来实现这一点,但在我看来,我可能需要预先执行一个查询,以获取以后要迭代的所有行,然后对我决定移动的文件执行REPLACE或UPDATE语句。在

我不熟悉sqlite3模块的内部结构,但我认为在迭代用于原始select的游标时执行REPLACE/UPDATEs是个坏主意。在

是否有另一种方法不需要返回替换/更新?我确实需要从其他表进行查询,使用文件哈希来获取其他元数据,以便构造重命名。在


Tags: 模块文件路径数据库内容sqlite地方模式
1条回答
网友
1楼 · 发布于 2024-04-30 07:18:43

我认为除了通过sqlupdate、INSERT或REPLACE之外,没有其他方法可以修改表中的行。(很容易认为sqlite3.Row对象可能允许赋值,并写回它所代表的行,但不允许)

至于做更新(通过第二个光标),当有一个未完成的光标用于原始选择时,你会问这是不是一个坏主意,我不知道你是否担心正确性或性能(正确性:光标变得混乱,并没有迭代所有的行,它应该正好一次;性能:游标确实只迭代一次它应该遍历的所有行,但是有一堆昂贵的额外查询)?在

WRT的正确性,这似乎很好,我只是做了一个快速测试,我创建了两个游标,c1和c2,然后在c1上执行了一个SELECT命令,然后在c2上执行了一个影响相同行的UPDATE命令,然后查看了c1.fetchall()的结果。它仍然包含所有正确的行,尽管第一行中的数据是过时的(可能是通过初始查询获取的),后面行中的数据也已更新(可能只在更新后使用fetchall获取)。在

(另外,如果c2上的更新影响到c1上的SELECT将返回哪些记录,则这些记录将不再被提取,但显然已经提取的任何内容都已被提取,并且光标.执行()似乎马上就能拿到第一张唱片,因此,使用与上面相同的命令顺序并使用一个UPDATE命令使原始SELECT什么也找不到,后面的c1.fetchall()仍然返回一条记录。)

至于性能,我不知道从上一段来看,我觉得它必须重复查询,这可能是昂贵的,也可能不是昂贵的,这取决于查询。(这可能不是字面上重复它;也许这项工作无论如何都要推迟到实际的获取)

短篇故事:我不认为没有其他方法可以在不更新或替换的情况下做到这一点,而且我认为即使在迭代原始光标时也可以进行这些更新。在

相关问题 更多 >