我正在开发一个应用程序,我在其中迭代表中的许多(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
有没有更好的方法来解决这个问题,而不是将数据复制到一个单独的(临时)表并从那里选择?
澄清:我忽略了说我需要在循环中做提交.该过程可能会中断,并且必须提交部分完成的工作,因此不需要在下一次运行时重做.
解决方法:
>使用WAL mode(所以作者和读者不要干涉)
>为读写器使用单独的连接
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。