这很奇怪(不过,这是我第一次尝试使用python / sqlite),但是如果我执行 fetchAll(),我似乎可以获得所有行,但除此之外 - 无论我尝试什么,总是在db中只返回第一行 - 第二次迭代因为返回null而停止。想知道我是如何在python中编写代码的?数据库似乎没问题..
con = sqlite3.connect('backup.db')
con.row_factory = sqlite3.Row
cur = con.cursor()
cur.execute('select * from tb1;')
for row in cur:
try:
# row = dataCur.fetchone()
#if row == None: break
print type(row)
print ' Starting on: %i' % row[0]
cleaner = Cleaner(scripts=True, remove_tags=['img'], embedded=True)
try:
cleaned = cleaner.clean_html(row[2]) #data stored in second col
cur.execute('update tb1 set data = ? where id = ?;', (cleaned, row[0]))
except AttributeError:
print 'Attribute error'
print ' Ended on: %i' % row[0]
except IOError:
print 'IOexception'
答案 0 :(得分:6)
您正在重复使用相同的光标来执行两个不同的查询。尝试使用两个不同的游标,看看是否能解决您的问题。
答案 1 :(得分:3)
如果我没弄错,第二次在Cursor上调用execute时,前一次调用的结果将被丢弃。
这就是为什么你可以使用fetchall,因为它会在你再次调用execute之前返回所有结果。
对于更新,请使用第二个Cursor,以避免第一个结果无效。
答案 2 :(得分:0)
每次获取数据之前,必须执行命令/ SQL查询。 fetchall()
,fetchone()
等。仅抓取已经执行的内容;因此,当您执行一次时,除非已经执行过一次查询,否则无法获取多次。