Skip to main content
 首页 » 编程设计

python之SQLAlchemy 'prepared' 状态

2025年05月04日8三少

我在通过 mod_wsgi 在 linux 机器上运行的 Python 2.7 上运行 SQL Alchemy 0.8.1 时遇到问题。 它有时会产生“InvalidRequestError:此 session 处于‘准备’状态;在此事务中无法发出进一步的 SQL”。

下面是错误的详细堆栈跟踪:

 
... 
 File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2173, in one 
    ret = list(self) 
                self = <sqlalchemy.orm.query.Query object at 0x7f6f64348dd0> 
 
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2216, in __iter__ 
    return self._execute_and_instances(context) 
                self = <sqlalchemy.orm.query.Query object at 0x7f6f64348dd0> 
             context = <sqlalchemy.orm.query.QueryContext object at 0x7f6f64348d50> 
 
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2229, in _execute_and_instances 
    close_with_result=True) 
        querycontext = <sqlalchemy.orm.query.QueryContext object at 0x7f6f64348d50> 
                self = <sqlalchemy.orm.query.Query object at 0x7f6f64348dd0> 
 
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2220, in _connection_from_session 
    **kw) 
                self = <sqlalchemy.orm.query.Query object at 0x7f6f64348dd0> 
                  kw = {'clause': , 'close_with_result': True, 'mapper': } 
 
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 798, in connection 
    close_with_result=close_with_result) 
              mapper =  
              clause = <sqlalchemy.sql.expression.Select at 0x7f6f64348d90; Select object> 
                self = <sqlalchemy.orm.session.Session object at 0x7f6f68f6fe50> 
                  kw = {} 
                bind = Engine(mysql+mysqldb://xxx:yyy@localhost/zzz?charset=utf8) 
   close_with_result = True 
 
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 802, in _connection_for_bind 
    return self.transaction._connection_for_bind(engine) 
              engine = Engine(mysql+mysqldb://xxx:yyy@localhost/zzz?charset=utf8) 
                self = <sqlalchemy.orm.session.Session object at 0x7f6f68f6fe50> 
              kwargs = {'close_with_result': True} 
 
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 281, in _connection_for_bind 
    self._assert_active() 
                bind = Engine(mysql+mysqldb://xxx:yyy@localhost/zzz?charset=utf8) 
                self = <sqlalchemy.orm.session.SessionTransaction object at 0x7f6f69be8050> 
 
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 181, in _assert_active 
    "This session is in 'prepared' state; no further " 
         rollback_ok = False 
         prepared_ok = False 
          closed_msg = 'This transaction is closed' 
                self = <sqlalchemy.orm.session.SessionTransaction object at 0x7f6f69be8050> 
 
InvalidRequestError: This session is in 'prepared' state; no further SQL can be emitted within this transaction. 

此错误是随机发生的 - 可能需要几天时间才能看到,也可能会在 5 分钟后发生。我不明白是什么导致了这个问题和最大的问题——我不明白这个错误是什么意思。什么是“准备”状态?文档没有关于此状态的信息。据我所知,它与双向交易有一定关系,但我没有在我的代码中使用它们。我使用 Session.query 和 Session.commit。

如有任何帮助,我们将不胜感激。

请您参考如下方法:

我真的在这里猜测,但我认为也许您正在使用 wsgi 部署的线程,并且您的 session 实例不是线程本地的。您当然可以这样做,只需按照官方文档中的这个简短教程操作即可:

Contextual/Thread-local Sessions