Python数据集包&循环/更新行 -

时间:2014-12-09 18:22:40

标签: python sqlalchemy dataset

我正在尝试检索sqlite3数据库的内容,并使用for循环中的scraper更新此数据。

假定的流程如下:

  • 从数据集中检索所有行
  • 对于每一行,找到URL列并获取一些其他(更新的)数据
  • 获取此数据后,请将此数据进行upsert(更新,添加列,如果不存在)到URL的行中。
  • 我喜欢数据集包因为' 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
    

    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