gpt4 book ai didi

python - 使用 Python 检查然后更新 sqlite 中的行

转载 作者:行者123 更新时间:2023-12-01 06:14:39 25 4
gpt4 key购买 nike

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

我的问题是,如果我要迭代包含文件路径和哈希值的表的行,这些文件路径和哈希值用作数据库中其他地方使用的标识符,那么用于更新路径的适当模式是什么我继续前进,检查文件是否需要重命名,然后在移动文件时更新数据库中的行。

我开始编写一些Python来做到这一点,但在我看来,我可能需要预先执行一个查询来获取我稍后要迭代的所有行,然后随后执行REPLACE或UPDATE语句我决定移动的文件。

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

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

最佳答案

我认为除了通过 SQL 更新、插入或替换之外,没有其他方法可以修改表中的行。 (很容易认为 sqlite3.Row 对象可能允许赋值,并写回它所代表的行,但事实并非如此。)

至于执行 UPDATE(通过第二个游标),而有一个出色的游标用于原始 SELECT - 你问这是否是一个坏主意 - 我不知道你是否担心正确性或性能(正确性:游标会感到困惑,并且不会迭代它应该恰好一次的所有行;性能:游标确实会迭代它应该恰好一次的所有行,但有一堆昂贵的额外查询)?

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

(此外,如果 c2 上的 UPDATE 影响 c1 上的 SELECT 将返回哪些记录,则将不再获取此类记录,但显然已经获取的任何内容都已获取,并且再次cursor.execute()似乎立即获取第一条记录,因此使用与上面相同的命令顺序并使用 UPDATE 命令会使原始 SELECT 找不到任何内容,后面的 c1.fetchall() 仍然返回一条记录。)

至于性能,我不知道 - 从前一段来看,在我看来它必须重复查询,这可能会或可能不会很昂贵,具体取决于查询。 (它可能不是字面意义上的重复;也许这项工作无论如何都会被推迟到实际获取时。)

简短的故事:我认为没有其他方法可以在不更新或替换的情况下执行此操作,并且我认为即使在原始游标上迭代时也可以进行这些更新。

关于python - 使用 Python 检查然后更新 sqlite 中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3926606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com