python - 在 python-2.7 的 sqlite3 中的嵌套循环中使用多个游标

标签 python sqlite python-2.7

我在嵌套循环中的单个 sqlite 数据库上使用多个游标时遇到了问题。我找到了一个适合我的解决方案,但它是有限的,我还没有在网上看到这个特定问题的记录。我是这样发布的:

  • 有明确的问题/解决方案
  • 看看有没有更好的解决方案
  • 也许我在 sqlite3 python 模块中发现了一个缺陷

我的 Python 应用程序在 sqlite 中存储社会关系数据。数据集包括两个表之间的一对多关系:myConnections 和 sharedConnections。前者每个连接都有一行。 sharedConnections 表有 0:N 行,具体取决于共享的连接数。为了构建结构,我使用了一个嵌套循环。在外部循环中,我访问了 myConnections 中的每一行。在内部循环中,我填充了 sharedConnections 表。代码如下所示:

curOuter = db.cursor()  
for row in curOuter.execute('SELECT * FROM myConnections'):    
    id  = row[0]  
    curInner = db.cursor()  
    scList = retrieve_shared_connections(id)  
    for sc in scList:  
        curInner.execute('''INSERT INTO sharedConnections(IdConnectedToMe, IdShared) VALUES (?,?)''', (id,sc))  
db.commit()  

结果很奇怪。 sharedConnections 表获取 myConnections 中前两条记录的重复条目。他们有点整理。 A的关系,B的关系,然后是A,然后是B。经过最初的卡顿,处理是正确的!示例:

myConnections
-------------
a   
b  
c  
d  

sharedConnections
-------------
a->b  
a->c  
b->c  
b->d  
a->b  
a->c  
b->c  
b->d  

解决方案不完善。我没有使用来自外部循环游标的迭代器,而是 SELECT,然后是 fetchall() 并循环遍历结果列表。由于我的数据集非常小,所以这没问题。

curOuter = db.cursor()
curOuter.execute('SELECT * FROM myConnections'):
rows = curOuter.fetchall()
for row in rows:    
    id  = row[0]
    curInner = db.cursor()
    scList = retrieve_shared_connections(id)
    for sc in scList:
        curInner.execute('''INSERT INTO sharedConnections(IdConnectedToMe, IdShared) VALUES (?,?)''', (id,sc))
db.commit()

给你。在嵌套循环中对同一个 sqlite 数据库中的不同表使用两个游标似乎不起作用。更重要的是,它不会失败,只会给出奇怪的结果。

  • 这真的是最好的解决方案吗?
  • 有更好的解决方案吗?
  • 这是应该解决的缺陷吗?

最佳答案

这看起来像您正在点击 issue 10513 ,已在 Python 2.7.13、3.5.3 和 3.6.0b1 中修复。

处理事务的方式存在错误,在某些情况下,所有 游标状态都被重置。这导致 curOuter 再次从头开始。

解决方法是升级,或者在您可以升级之前,不要跨事务提交使用游标。通过使用 curOuter.fetchall(),您实现了后者。

关于python - 在 python-2.7 的 sqlite3 中的嵌套循环中使用多个游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13237788/

相关文章:

python - 如何在 python 命令中使用 vim 列表?

mysql - Peewee 在 sqlite 而不是 mysql 中创建表

python-2.7 - 如何在 python 中求解 3 个非线性方程

python - 如何找到每个组的第一个局部最大值?

python - python中每个子类中类变量的不同值

Python 编写带有行和列转置的 .csv 文件

sqlite - SQLite的小数位问题

python - 使用 Tensorflow batch_norm 函数获得低测试精度

java - 在android中将值插入到sqlite数据库中

android - 数据库更改后 ListView 未更新