我正在尝试检索sqlite3数据库的内容,并使用for循环中的scraper更新此数据。
假定的流程如下:
我喜欢数据集包因为' upsert',允许它动态添加我可能添加到数据库中的任何列(如果不存在)。
然而,我的代码会产生一个我无法解释的错误。
'ResourceClosedError: This result object is closed.'
如果不碰到这个目标,我将如何获得目标?以下代码段重新创建了我的问题。
导入数据集 db = dataset.connect(' sqlite:///test.db')
# Add two dummy rows
testrow1 = {'TestID': 1}
testrow2 = {'TestID': 2}
db['test'].upsert(testrow1, ['TestID'])
db['test'].upsert(testrow2, ['TestID'])
print("Inserted testdata before loop")
# This works fine
testdata = db['test'].all()
for row in testdata:
print row
# This gives me an 'ResourceClosedError: This result object is closed.' error?
i = 1 # 'i' here exemplifies data that I'll add through my scraper.
testdata = db['test'].all()
for row in testdata:
data = {'TestID': i+1000}
db['test'].upsert(data, ['TestID'])
print("Upserted within loop (i = " + str(i) + ")")
i += 1
答案 0 :(得分:2)
问题可能是你正在查询数据集并访问结果对象(在'这工作正常")并在循环中读取所有内容然后立即尝试再次使用upserts进行另一个循环相同的结果对象。错误告诉您资源已关闭,基本上一旦您读取它,连接就会自动关闭(作为一项功能!)。 (see this answer关于'自动关闭'了解更多关于解决问题的原因和方法。)
鉴于结果资源趋向于关闭,请尝试在upsert循环开始时再次获取结果:
i = 1 # 'i' here exemplifies data that I'll add through my scraper.
testdata = db['test'].all()
for row in testdata:
data = {'TestID': i}
db['test'].upsert(data, ['TestID'])
print("Upserted within loop (i = " + str(i) + ")")
i += 1
编辑:请参阅注释,上面的代码会更改循环内的testdata,因此仍会出现相同的错误,因此解决此问题的方法是先将数据读入数组,然后循环遍历该数组以进行更新。类似的东西:
i = 1 # 'i' here exemplifies data that I'll add through my scraper.
testdata = [row for row in db['test'].all()]
for row in testdata:
data = {'TestID': i}
db['test'].upsert(data, ['TestID'])
print("Upserted within loop (i = " + str(i) + ")")
i += 1