我在嵌套循环中的单个 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
解决方案不完善。不是使用来自外部循环游标的迭代器,而是 I 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 数据库中的不同表使用两个游标似乎不起作用。更重要的是,它不会失败,它只会给出奇怪的结果。
- 这真的是最好的解决方案吗?
- 有更好的解决方案吗?
- 这是一个应该解决的缺陷吗?