Using multiple cursors in a nested loop in sqlite3 from python-2.7
This looks like you are hitting issue 10513, fixed in Python 2.7.13, 3.5.3 and 3.6.0b1.
There was a bug in the way transactions were handled, where all cursor states were reset in certain circumstances. This led to curOuter
starting from the beginning again.
The work-around is to upgrade, or until you can upgrade, to not use cursors across transaction commits. By using curOuter.fetchall()
you achieved the latter.
You could build up a list of rows to insert in the inner loop and then cursor.executemany() outside the loop. This doesn't answer the multiple cursor question but may be a workaround for you.
curOuter = db.cursor()
rows=[]
for row in curOuter.execute('SELECT * FROM myConnections'):
id = row[0]
scList = retrieve_shared_connections(id)
for sc in scList:
rows.append((id,sc))
curOuter.executemany('''INSERT INTO sharedConnections(IdConnectedToMe, IdShared) VALUES (?,?)''', rows)
db.commit()
Better yet only select the ID from myConnections:
curOuter.execute('SELECT id FROM myConnections')