循环遍历动态表

时间:2014-01-31 16:58:32

标签: python database sqlite logic

如何遍历动态数据库表?

我遇到的情况是我需要循环遍历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数据库对象没有更新为其他变量,否则它将运行良好。

解决这个问题的方法是什么?

1 个答案:

答案 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 中。