
SQLAlchemy没有内置此功能,因为它符合DBAPI /数据库的要求,是最佳和最有效的验证和强制值来源。
为了构建自己的验证,通常使用TypeDecorator或ORM级验证。TypeDecorator的优点是它在核心运行,并且非常透明,尽管它仅在实际发出SQL时发生。
为了尽早进行验证和强制,这是在ORM级别上。
可以在ORM层通过
@validates以下方式进行临时验证:
http://docs.sqlalchemy.org/en/latest/orm/mapped_attributes.html#simple-
validators
@validates使用的事件系统也可以直接使用。您可以编写一个通用的解决方案,将您选择的验证器链接到要映射的类型:
from sqlalchemy import Column, Integer, String, DateTimefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import eventimport datetimebase= declarative_base()def validate_int(value): if isinstance(value, basestring): value = int(value) else: assert isinstance(value, int) return valuedef validate_string(value): assert isinstance(value, basestring) return valuedef validate_datetime(value): assert isinstance(value, datetime.datetime) return valuevalidators = { Integer:validate_int, String:validate_string, DateTime:validate_datetime,}# this event is called whenever an attribute# on a class is instrumented@event.listens_for(base, 'attribute_instrument')def configure_listener(class_, key, inst): if not hasattr(inst.property, 'columns'): return # this event is called whenever a "set" # occurs on that instrumented attribute @event.listens_for(inst, "set", retval=True) def set_(instance, value, oldvalue, initiator): validator = validators.get(inst.property.columns[0].type.__class__) if validator: return validator(value) else: return valueclass MyObject(base): __tablename__ = 'mytable' id = Column(Integer, primary_key=True) svalue = Column(String) ivalue = Column(Integer) dvalue = Column(DateTime)m = MyObject()m.svalue = "ASdf"m.ivalue = "45"m.dvalue = "not a date"验证和强制也可以使用TypeDecorator在类型级别上构建,尽管仅当发出SQL时才如此,例如本示例将utf-8字符串强制为unipre:
http://docs.sqlalchemy.org/zh_CN/latest/core/custom_types.html#coercing-
enpred-strings-to-
unipre
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)