Đó là đơn giản nhất để chỉ đổi tên các cột ánh xạ và proxy nó thông qua một tài sản:
class Something(Base):
...
_foo = Column('foo', String(123))
@property
def foo(self):
return self._foo
@foo.setter
def foo(self, value):
if len(value) > _foo.type.length:
raise Exception("Value too long")
self._foo = value
Bạn có thể dễ dàng yếu tố ra việc tạo ra tài sản, và thậm chí sử dụng một khuôn khổ xác nhận chung chung như formencode .
Nếu bạn cần thêm giải pháp SQLAlchemy cụ thể và không ngại sử dụng giao diện cụ thể, thì SQLAlchemy có cơ chế mở rộng để ghi lại sự kiện trên thuộc tính. Một validator sử dụng đó sẽ giống như thế này:
from sqlalchemy.orm.interfaces import AttributeExtension, InstrumentationManager
from sqlalchemy.orm import ColumnProperty
class InstallValidatorListeners(InstrumentationManager):
def post_configure_attribute(self, class_, key, inst):
"""Add validators for any attributes that can be validated."""
prop = inst.prop
# Only interested in simple columns, not relations
if isinstance(prop, ColumnProperty) and len(prop.columns) == 1:
col = prop.columns[0]
# if we have string column with a length, install a length validator
if isinstance(col.type, String) and col.type.length:
inst.impl.extensions.insert(0, LengthValidator(col.type.length))
class ValidationError(Exception):
pass
class LengthValidator(AttributeExtension):
def __init__(self, max_length):
self.max_length = max_length
def set(self, state, value, oldvalue, initiator):
if len(value) > self.max_length:
raise ValidationError("Length %d exceeds allowed %d" %
(len(value), self.max_length))
return value
Sau đó bạn sẽ sử dụng tiện ích này bằng cách thiết lập __sa_instrumentation_manager__ = InstallValidatorListeners
trên bất kỳ lớp học mà bạn muốn xác nhận. Bạn cũng có thể đặt nó trên lớp cơ sở nếu bạn muốn nó áp dụng cho tất cả các lớp bắt nguồn từ nó.
Nguồn
2010-02-23 11:55:16
Vui lòng cung cấp mã bạn đang sử dụng để xác định các bảng và các bản đồ để lớp học của bạn. AFAIK, cơ sở dữ liệu nên nêu ra một lỗi truyền lại thông qua SQLAlchemy. Vui lòng đăng mã để cung cấp một số gợi ý về những gì bạn đang cố gắng ngay bây giờ. –
@ S.Lott MySQL không kiểm tra độ dài chuỗi khi chèn/cập nhật. Nó âm thầm cắt ngắn các chuỗi quá dài. – codeape