gpt4 book ai didi

python - SQLite:选择受后续插入影响的结果

转载 作者:太空宇宙 更新时间:2023-11-03 13:22:50 25 4
gpt4 key购买 nike

我正在开发一个应用程序,在该应用程序中,我在表中迭代许多(1,000,000+)行,同时插入新行并沿途更新现有行。要求 select 语句生成表中的每一行(最初执行 select 时存在的行)恰好一次,并且决不生成执行 select 后插入的行。我不希望将所有行都加载到内存中(这需要很长时间和大量 RAM——我试过了)。

我已经开发了一个小的 Python 示例,该示例演示了 SQLite 显然不会将插入(以及可能的更新和删除)与长时间运行的选择隔离开来。我无法在 SQLite 文档中找到任何专门提到此行为的地方,但我发现了几个链接暗示插入会失败(可能在 SQLite 的早期版本中?),但在我的示例中却没有.

import sqlite3

def select_affected_by_insert():
# select from and simultaneously modify same table
cn = sqlite3.connect(':memory:')
cn.execute("CREATE TABLE demo (v INTEGER PRIMARY KEY)")

n = 5
values = [[v] for v in range(n)]
cn.executemany('INSERT INTO demo VALUES (?)', values)

for (v,) in cn.execute('SELECT v FROM demo'):

with cn:
# insert in transaction
cn.execute('INSERT INTO demo VALUES (?)', [n + v])

print v, n + v
assert v < n, 'got more rows than expected!'

if __name__ == '__main__':
select_affected_by_insert()

SQLite 3.6.12
Python 2.6.4

有没有比将数据复制到一个单独的(临时)表并从那里选择更好的方法来解决这个问题?

澄清:我忘了说我需要在循环内进行提交。该过程可能会中断,并且必须提交部分完成的工作,这样就不需要在下一次运行时重做。

最佳答案

  1. 使用WAL mode (所以作者和读者不要干涉)
  2. 为读取器和写入器使用单独的连接

关于python - SQLite:选择受后续插入影响的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8441557/

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