我在SQLAlchemy中使用了聲明性擴展,並且當我試圖用不正確的數據保存映射類的實例時發現了一個奇怪的錯誤(特別是用nullable = False聲明的列無的價值)。SQLAlchemy引發無,導致TypeError
類(簡體):
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, autoincrement=True)
userid = Column(String(50), unique=True, nullable=False)
導致錯誤(會話是SQLAlchemy的會議):
>>> u = User()
>>> session.add(u)
>>> session.commit()
...
TypeError: exceptions must be old-style classes or derived from BaseException, not NoneType
在導致該異常的代碼看,我發現(在SQLAlchemy的。 orm.session):
except:
transaction.rollback(_capture_exception=True)
raise
在這種情況下被捕獲的異常是sqlalchemy.exc.Oper ationalError。如果我將這些行更改爲:
except Exception as e:
transaction.rollback(_capture_exception=True)
raise e
然後問題消失,OperationalError被拋出而不是None。儘管原始代碼不應該在最新版本的Python中工作嗎? (我使用的是2.7.2)這個錯誤是否特定於我的應用程序?
的Python 2.7.2
SQLAlchemy的0.7.5
UPDATE:錯誤似乎是特定於我在某些方面的應用。我用一個SQLAlchemy引擎封裝了一個eventlet.db_pool,這似乎是問題的根源。使用內存中的SQLite或基本的MySQL引擎來運行我的簡單測試不存在這個問題,但是使用它的db_pool。
測試用例:https://gist.github.com/1980584
完整回溯是:
Traceback (most recent call last):
File "test_case_9525220.py", line 41, in <module>
session.commit()
File "/usr/local/Cellar/python/2.7.2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 645, in commit
self.transaction.commit()
File "/usr/local/Cellar/python/2.7.2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 313, in commit
self._prepare_impl()
File "/usr/local/Cellar/python/2.7.2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 297, in _prepare_impl
self.session.flush()
File "/usr/local/Cellar/python/2.7.2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 1547, in flush
self._flush(objects)
File "/usr/local/Cellar/python/2.7.2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 1635, in _flush
raise
TypeError: exceptions must be old-style classes or derived from BaseException, not NoneType
你正在使用什麼版本的sqlalchemy? – Crast 2012-03-01 23:09:03
SQLAlchemy 0.7.5 – robbles 2012-03-01 23:41:35
DBAPI是什麼(包括版本)和錯誤的確切性質是什麼? OperationalError從DBAPI傳播。在這裏完整的再現測試將是最好的,並附上它作爲一張票到http://www.sqlalchemy.org/trac/newticket – zzzeek 2012-03-02 00:05:08