Tôi đang sử dụng phần mở rộng khai báo trong SQLAlchemy và tôi nhận thấy một lỗi lạ khi tôi cố gắng lưu một thể hiện của một lớp được ánh xạ với dữ liệu không chính xác (cụ thể là một cột được khai báo với nullable = False với giá trị của None).SQLAlchemy tăng None, gây ra TypeError
Lớp (giản thể):
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, autoincrement=True)
userid = Column(String(50), unique=True, nullable=False)
gây ra lỗi (phiên là một phiên SQLAlchemy):
>>> u = User()
>>> session.add(u)
>>> session.commit()
...
TypeError: exceptions must be old-style classes or derived from BaseException, not NoneType
Nhìn vào mã gây ra ngoại lệ này, tôi thấy (trong SQLAlchemy. orm.session):
except:
transaction.rollback(_capture_exception=True)
raise
Trường hợp ngoại lệ bị bắt trong trường hợp này là sqlalchemy.exc.Oper ationalError. Nếu tôi thay đổi những dòng này thành:
except Exception as e:
transaction.rollback(_capture_exception=True)
raise e
thì sự cố sẽ biến mất và OperationalError bị ném thay vì Không. Chẳng phải mã ban đầu có hoạt động trong bất kỳ phiên bản Python nào gần đây không? (Tôi đang sử dụng 2.7.2) Có phải lỗi này bằng cách nào đó cụ thể đối với đơn đăng ký của tôi không?
Python 2.7.2
SQLAlchemy 0.7.5
UPDATE: lỗi dường như là đặc trưng cho ứng dụng của tôi một cách nào đó. Tôi đang gói một eventlet.db_pool với một công cụ SQLAlchemy, mà dường như là nguồn gốc của vấn đề bằng cách nào đó. Chạy thử nghiệm đơn giản của tôi với SQLite trong bộ nhớ hoặc công cụ MySQL cơ bản không có vấn đề này, nhưng với db_pool nó có.
Kiểm tra trường hợp: https://gist.github.com/1980584
Các traceback đầy đủ là:
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
Bạn đang sử dụng phiên bản sqlalchemy nào? – Crast
SQLAlchemy 0.7.5 – robbles
DBAPI là gì (bao gồm cả phiên bản) và bản chất chính xác của lỗi là gì? OperationalError được truyền từ DBAPI. Một bài kiểm tra tái tạo đầy đủ ở đây sẽ là tốt nhất và đính kèm nó như một vé vào http://www.sqlalchemy.org/trac/newticket – zzzeek