如何遍历动态数据库表?
我遇到的情况是我需要循环遍历n
行的表,而循环它会在同一个表中添加一些行,它应该循环,直到所有旧的和新添加的行都没有迭代到最后。
例如我创建了原型
import sqlite3 as lite
import sys
con = None
try:
con = lite.connect('dynamiciteration.db')
cur = con.cursor()
cur.execute("DROP TABLE IF EXISTS tbl")
cur.execute("CREATE TABLE tbl (id INTEGER PRIMARY KEY, roll text)")
cur.execute("insert into tbl (roll) values ('1')")
con.commit()
except lite.Error, e:
print "Error %s:" % e.args[0]
sys.exit(1)
cur.execute("select roll from tbl")
rows = cur.fetchall()
print len(rows)
j = 0
for row in rows:
#print 'iteration '+str(j)
j = j + 1
try:
cur.execute("insert into tbl (roll) values ('"+str(j)+"')")
con.commit()
if(j < 100):
cur.execute("select roll from tbl")
rows = cur.fetchall()
print len(rows)
except lite.Error, e:
print "Error %s:" % e.args[0]
sys.exit(1)
我在其中添加了if (j < 100)
的终止条件。问题是rows
数据库对象没有更新为其他变量,否则它将运行良好。
解决这个问题的方法是什么?
答案 0 :(得分:1)
您正在将rows
列表重新绑定到新的结果集,for
循环看不到这样的重新绑定。就像你做的那样:
somelist = [1, 2, 3]
for i in somelist:
somelist = [1, 2, 3, 4, 5]
print i
这只会打印数字1,2和3。
您可以使用while
循环:
index = 0
while index < len(rows)
row = rows[index]
index += 1
每次检查rows
条件时,以及每次迭代设置while
时,都会取消引用row
。
但是你必须非常小心你的订购,以确保数据库将新行添加到列表结果的 end 中。