这很难描述或显示很多代码,但我会尝试。基本上我有一个多线程的桌面应用程序,将经常处理线程中添加/删除/更改表。从我读的内容来看,我应该使用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