2014-10-03 78 views
0

我寫了一個腳本,用於在社交網絡中迭代饋送,並在另一個社交網絡中發佈尚未發佈的帖子。我分兩步來做:首先閱讀第一個社交網絡的提要,並將每篇文章都放在我的數據庫中,包括一個「發佈」布爾值。其次,我遍歷發佈布爾值設置爲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個結果並將其加載到列表中,迭代和處理列表中的條目,承諾,繼續下一個20。 – 2016-04-20 18:56:11