Я написал небольшой скрипт, который выполняет итерацию фида в социальной сети и публикует еще не опубликованные публикации в другой социальной сети. Я делаю это в 2 этапа: сначала я прочитал канал первой социальной сети и поместил каждую запись в свою базу данных, включая «опубликованную» логическую. Во-вторых, я просматриваю все записи в моей базе данных, где опубликованное значение boolean установлено false и публикует сообщения во второй социальной сети. Я использую библиотеку dataset для подключения к локальной базе данных SQLite. Теперь проблема в том, что все работает нормально на первом этапе. На втором шаге я повторяю записи базы данных с указанным логическим значением в false, размещаю запись во вторую социальную сеть, а затем я хочу обновить логическое значение в моей базе данных. Там лежит проблема: обновление работает только один раз, а затем я получаю следующее сообщение об ошибке:Ошибка базы данных набора данных Python
Traceback (most recent call last):
File "xy.py", line 56, in <module>
table.update(data, ['sc_id'])
File "/Users/.../lib/python2.7/site-packages/dataset/persistence/table.py", line 137, in update
rp = self.database.executable.execute(stmt)
File "/Users/.../lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1752, in execute
return connection.execute(statement, *multiparams, **params)
File "/Users/.../lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 729, in execute
return meth(self, multiparams, params)
File "/Users/.../lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 321, in _execute_on_connection
return connection._execute_clauseelement(self, multiparams, params)
File "/Users/.../lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 826, in _execute_clauseelement
compiled_sql, distilled_params
File "/Users/.../lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 997, in _execute_context
self._commit_impl(autocommit=True)
File "/Users/.../lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 530, in _commit_impl
self.connection._reset_agent is self.__transaction:
File "/Users/.../lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 236, in connection
return self._revalidate_connection()
File "/Users/.../lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 247, in _revalidate_connection
raise exc.ResourceClosedError("This Connection is closed")
sqlalchemy.exc.ResourceClosedError: This Connection is closed
Это способ, которым я обновить поле базы данных (в соответствии с документацией набора данных):
unpublished_messages = table.find(published = False)
for posting in unpublished_messages:
# here i post to the second social network...
data = dict(sc_id = posting['sc_id'], published = True)
table.update(data, ['sc_id'])
На первом этапе он отлично работает, и он работает один раз на втором этапе при повторении записей в базе данных, но во второй итерации цикла он падает на строку table.update ....
Я абсолютно не понимаю, что происходит.
Аналогично со словарем или списком вы не можете изменять объект, из которого вы выполняете итерацию. Без необходимости загружать все результаты в памяти, вы могли бы разбивать на страницы результаты и работать с группами одновременно, подобно тому, как работает мой искатель Tumblr - захватывать 20 результатов и загружать их в список, выполнять итерации записей в списке, commit, перейдите к следующим 20. –