Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更改基础数据库时sqlite游标行为不一致_Python_Sqlite_Database Cursor - Fatal编程技术网

Python 更改基础数据库时sqlite游标行为不一致

Python 更改基础数据库时sqlite游标行为不一致,python,sqlite,database-cursor,Python,Sqlite,Database Cursor,我很难理解python的sqlite3模块的游标对象的行为。据我所知,游标对象的行为就像迭代器,在数据结构上保持“视图”。现在,我认为这有两种表现方式: 1) 执行时,与SELECT*语句匹配的数据库状态与未来的更改分开 2) 执行时,与SELECT*语句匹配的数据库状态只是底层可变数据的视图。也就是说,一旦对。。。在当前行中执行 但显然情况并非如此,请参见下面的脚本和输出。执行此脚本时,为什么UPDATE命令未合并到光标中,而INSERT被合并到光标中?总是使用result=list(cur.

我很难理解python的sqlite3模块的游标对象的行为。据我所知,游标对象的行为就像迭代器,在数据结构上保持“视图”。现在,我认为这有两种表现方式:

1) 执行时,与
SELECT*
语句匹配的数据库状态与未来的更改分开

2) 执行时,与
SELECT*
语句匹配的数据库状态只是底层可变数据的视图。也就是说,
一旦对。。。在当前
行中执行

但显然情况并非如此,请参见下面的脚本和输出。执行此脚本时,为什么
UPDATE
命令未合并到光标中,而
INSERT
被合并到光标中?总是使用
result=list(cur.execute(…)
更好吗

输出

in db: (1, smith), (2, mia)
altering table: add (3, kim), change (1, smith) to (1, james)

1) expect immutable: (1, smith), (2, mia)
2) expect mutable: (1, james), (2, mia), (3, kim)

But got: 
(1, 'smith')
(2, 'mia')
(3, 'kim')
平台

  • Ubuntu 18.10 x64
  • Python 3.6.7(默认,2018年10月22日,11:32:17)
  • sqlite3.version='2.6.0'

    • 不幸的是,SQLite就是这样工作的。发件人:

      。。。但是,SELECT语句运行时发生的更改又如何呢?如果启动一个SELECT语句,sqlite3_step()接口逐步完成大约一半的输出,然后应用程序运行一些UPDATE语句来修改SELECT语句正在读取的表,然后对sqlite3_step()进行更多调用以完成SELECT语句,该怎么办?SELECT语句的后续步骤是否会看到更新所做的更改?答案是这种行为没有定义。。。因此,开发人员应该努力避免编写那些假设在这种情况下会发生什么的应用程序


      这意味着SQLite可以在同一数据库的不同连接之间提供某种隔离(注意,只有一个连接应该写入),但是您不应该尝试在SELECT的开始和结束之间修改数据库,至少是正在读取的表。

      I得到以下信息:(1,u'james')(2,u'mia')(3,u'kim')。我使用的是Python 2.7 windows 7真的吗?奇怪的是,我只是再次检查了我提供的源代码。没用。你在用什么平台?我使用的是python3.6.7 ubuntu 18.10Tbh。我不太明白。我只有一个连接,尽管有两个不同的游标(afaik,connection.execute临时创建一个)。所以解决这个问题最省钱的方法就是对所有东西都使用list(…)?那么connection.commit()呢?这不是一个同步障碍吗?呃,我想这就是我在URL中遇到的问题:同一数据库连接上的操作之间没有隔离。所以两个连接可以解决这个问题,而不是使用两个游标?@JonasB。对这在链接页面中是明确的(我只复制了我认为答案中最相关的部分)。如果您有两个不同的连接,一个用于选择,而在选择过程中另一个用于插入或更新,则在选择中不会看到任何修改。使用两个连接时,我会遇到锁定问题。只要我从一个连接调用
      cur.execute(…)
      ,数据库就会被锁定,直到我遍历结果为止。我无法调用
      con2.commit()
      ,因为它超时了。我想使用list(…)是最简单的选择。“我有种感觉,我在这里做错了什么事。”乔纳斯说。虽然任意数量的连接可以一次从sqlite数据库中读取,但一次只能有一个连接可以写入,并且在写入过程中无法读取任何连接(除非使用)。
      in db: (1, smith), (2, mia)
      altering table: add (3, kim), change (1, smith) to (1, james)
      
      1) expect immutable: (1, smith), (2, mia)
      2) expect mutable: (1, james), (2, mia), (3, kim)
      
      But got: 
      (1, 'smith')
      (2, 'mia')
      (3, 'kim')