What can cause an iterator to go forwards in a loop, and then backwards?
This is the code I'm using to loop through the table's primary key field. The primary key is being used to populate initial values in a separate table.
For loop:
for row in sampleDB.select_fromTable():
print row[0]
sampleDB.insert_toTable(row[0], 2.0)
sqllite insert statement:
def insert_toTable(self, primaryKey, initial):
c = self.conn.cursor()
c.execute('insert into 开发者_StackOverflow中文版insert_toTable VALUES(?, ?)', (primaryKey, initial))
if c.rowcount == 1:
print "Updated row.\n"
else:
print "Row does not exist.\n"
self.conn.commit()
c.close()
The select statement that creates the tuple to loop through:
def select_fromTable(self):
c = self.conn.cursor()
c.execute('select * from sampleTable')
c.close
return c
Here is an example table:
Primary Key Text
0 John
1 Sue
2 Bill
3 Tyler
Running the loop without the insert statement prints each unique key once, but if I add the call to the insert function (insert_toTable) I get this phenomenon:
0
Updated row.
1
Updated row.
0
Traceback (most recent call last):
sqlite3.IntegrityError: column urlid is not unique
The next iteration of the loop should be to the unique value "2" not back to "0"....
I can provide more sections of code if needed.
I suspect the results of this code may change depending on exactly which versions of sqlite and python are used.
Notice that your call to c.close
in the select_fromTable
method should be c.close()
. This is a fortunate error, since you cannot iterate over the results of the query after the cursor is closed. However, the result is that you have two open cursors in the loop.
Try changing your select_fromTable
method to:
def select_fromTable(self):
c = self.conn.cursor()
c.execute('select * from sampleTable')
results = c.fetchall()
c.close()
return results
and see what happens. I believe it will fix your problem.
精彩评论