加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 11:22:15 所属栏目:Python 来源:网络整理
导读:我正在开发一个应用程序,我在其中迭代表中的许多(1,000,000)行,同时插入新行并沿途更新现有行.要求select语句产生表中的每一行(最初执行select时存在的那一行)恰好一次,并且永远不会产生在执行select之后插入的行.我宁愿不将所有行加载到内存中(这需要很长时
我正在开发一个应用程序,我在其中迭代表中的许多(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(所以作者和读者不要干涉) >为读写器使用单独的连接

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读