我在嵌套循环中的单个 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/