gpt4 book ai didi

python - Sqlite3 游标实时更新?

转载 作者:太空宇宙 更新时间:2023-11-04 00:24:03 24 4
gpt4 key购买 nike

谁能给我解释一下:

import sqlite3

db = sqlite3.connect(':memory:')

db.execute('create table t1 (id integer primary key, val text)')
db.execute('create table t2 (id integer primary key, val text)')

c = db.cursor()
c.execute('insert into t1 values (?, ?)', (1, 'a'))
c.execute('insert into t2 values (?, ?)', (1, 'b'))
c.execute('insert into t1 values (?, ?)', (2, 'c'))
c.execute('insert into t2 values (?, ?)', (2, 'd'))

c.execute('''select t1.id, t1.val, t2.val
from t1
left join t2 using (id)
where t1.id is not null

union all

select t2.id, t1.val, t2.val
from t2
left join t1 using (id)
where t2.id is not null
and t1.id is null

''')
for row in c:
print(row[0])
if row[0] == 1:
c2 = db.cursor()
c2.execute('delete from t1 where id = ?', (row[0],))

如果我注释掉最后三行,输出是:

1
2

但是如果我取消最后三行的注释,输出是:

1
2
1

即。第一个游标已更新为在第二个游标中执行的 DML 的结果。

这是预期的行为吗?有什么办法可以预防吗?

我正在运行 Python 3.6.3(根据 Ubuntu 17.10),以防出现差异。

最佳答案

如果可能,SQLite 按需计算结果行。但这并非总是可行,因此无法保证。

您永远不应该修改您当前正在另一个查询中读取的任何表。 (数据库可能会以不明显的方式扫描表,因此即使更改其他行也可能会更改枚举。)

如果您打算进行此类修改,则必须在进行更改之前读取所有行,例如,for row in c.fetchall()。或者,分步阅读表格,重新搜索上次查询离开的位置,即:

SELECT ... FROM MyTable WHERE ID > :LastID ORDER BY ID LIMIT 1;

关于python - Sqlite3 游标实时更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48081036/

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