2014-10-03 4 views
0

Я написал небольшой скрипт, который выполняет итерацию фида в социальной сети и публикует еще не опубликованные публикации в другой социальной сети. Я делаю это в 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 ....

Я абсолютно не понимаю, что происходит.

ответ

0

Как-то нельзя проходить через ResultIter ('unpublished_messages') и изменять таблицу на том же шаге. Я решил это, перейдя в ResultIter и поместив элементы в обычный список python. Затем я повторил список и обновил таблицу.

+0

Аналогично со словарем или списком вы не можете изменять объект, из которого вы выполняете итерацию. Без необходимости загружать все результаты в памяти, вы могли бы разбивать на страницы результаты и работать с группами одновременно, подобно тому, как работает мой искатель Tumblr - захватывать 20 результатов и загружать их в список, выполнять итерации записей в списке, commit, перейдите к следующим 20. –

Смежные вопросы