這很難描述或顯示很多代碼,但我會嘗試。基本上我有一個多線程的桌面應用程序,將經常處理線程中添加/刪除/更改表。從我讀的內容來看,我應該使用scoped_session並將其傳遞給各個線程來完成這項工作(我認爲?)。這裏有一些基本的代碼示例:線程會話在SQLAlchemy上過期嗎?
class SQL():
def __init__(self):
self.db = create_engine('mysql+mysqldb://thesqlserver')
self.metadata = MetaData(self.db)
self.SessionObj = scoped_session(sessionmaker(bind=self.db, autoflush=True))
db = SQL()
session = db.SessionObj()
someObj = Obj(val, val2)
session.add(someObj)
session.commit()
上面的類是我用作SQL東西的一般訪問權限。創建一個新的會話,執行查詢和更新後/添加到它,當session.commit(),我得到以下錯誤:
Traceback (most recent call last):
File "core\taskHandler.pyc", line 42, in run
File "core\taskHandler.pyc", line 184, in addTasks
File "core\sqlHandler.pyc", line 35, in commit
File "sqlalchemy\orm\session.pyc", line 624, in rollback
File "sqlalchemy\orm\session.pyc", line 338, in rollback
File "sqlalchemy\orm\session.pyc", line 369, in _rollback_impl
File "sqlalchemy\orm\session.pyc", line 239, in _restore_snapshot
File "sqlalchemy\orm\state.pyc", line 252, in expire
AttributeError: 'NoneType' object has no attribute 'expire'
那麼接下來如果另一個SQL嘗試經過:
Traceback (most recent call last):
File "core\taskHandler.pyc", line 44, in run
File "core\taskHandler.pyc", line 196, in deleteTasks
File "sqlalchemy\orm\query.pyc", line 2164, in scalar
File "sqlalchemy\orm\query.pyc", line 2133, in one
File "sqlalchemy\orm\query.pyc", line 2176, in __iter__
File "sqlalchemy\orm\query.pyc", line 2189, in _execute_and_instances
File "sqlalchemy\orm\query.pyc", line 2180, in _connection_from_session
File "sqlalchemy\orm\session.pyc", line 729, in connection
File "sqlalchemy\orm\session.pyc", line 733, in _connection_for_bind
File "sqlalchemy\orm\session.pyc", line 249, in _connection_for_bind
File "sqlalchemy\orm\session.pyc", line 177, in _assert_is_active
sqlalchemy.exc.InvalidRequestError: This Session's transaction has been rolled back by a nested rollback() call. To begin a new transaction, issue Session.rollback() first.
這就像我所知道的一樣多,我認爲我能描述的最好。任何想法,我在假設要在這裏做?這對我來說都是泥巴。提前致謝!
Shucks。那麼這是一個巨大的迴應,我非常感謝你提供的五段文章作爲迴應。總而言之,我應該做的是爲每一系列需要運行的任務創建一個新的會話?更具體地說,我應該爲每個工作線程定義一個_new_(session或scoped_session?)?本質上,我有一個大的線程運行GUI並執行一些小的SQL工作,然後處理一些更復雜/更長時間運行的SQL查詢/添加/更新的另一個工作線程。再次感謝您的迴應! – Cryptite
另外,使用SQLAlchemy 0.7.7。我認爲我理解了你所說的內容,並且更新了OP的代碼以反映我現在正在嘗試的內容,但是,無論何時執行'session.commit()',_Nonetype都沒有屬性'expire'_。實際的SQL任務經過並且表得到更新,但提交仍然會產生到期錯誤。 – Cryptite
如果你有一些一致的東西,然後將它工作成一個簡潔的(意思是:非常短,非常短,沒有多餘的細節)測試用例並將其發佈到郵件列表中,我會給它一個運行並提出建議。 – zzzeek