Я пытаюсь получить содержимое моей базы данных sqlite3 и обновлять эти данные, используя скребок в цикле for.Пакет Python Dataset package & looping/update rows -
Предполагаемая поток выглядит следующим образом:
Мне нравится пакет набора данных из-за «upsert», позволяя ему динамически добавлять любые столбцы, которые я, возможно, добавил в базу данных, если они не существуют.
Мой код выдает ошибку, которую я не могу объяснить.
'ResourceClosedError: This result object is closed.'
Как я могу получить свою цель, не столкнувсь с этим? Следующий фрагмент воссоздает мою проблему.
импорт набор данные дб = 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
Спасибо! Ты определенно прав на тех первых ошибках ;-) Я отредактировал вопрос. Ваше решение, похоже, не избавляется от этой ошибки, хотя я нашел обходное решение, выбрав элементы в списке до цикла - кажется, что это не похоже на цикл над ним при обновлении одной и той же таблицы? – MattV
Это действительно имеет смысл, потому что вы меняете то, что вы зацикливаете внутри цикла, что может привести к непредсказуемым результатам, если это разрешено. Я отредактировал мой ответ, спасибо за upvote! – brobas