使用SQLAlchemy ORM,我要确保值是其列的正确类型。
例如,假设我有一个Integer列。我尝试插入值“ hello”,它不是有效的整数。SQLAlchemy将允许我执行此操作。仅在稍后执行时session.commit(),它才会引发异常:sqlalchemy.exc.DataError: (DataError) invalid input syntax integer: "hello"…。
session.commit()
sqlalchemy.exc.DataError: (DataError) invalid input syntax integer: "hello"…
我要添加成批的记录add(…),出于性能原因,我不想在每笔记录之后提交。
add(…)
那么我该如何:
session.add(…)
commit()
SQLAlchemy没有内置此功能,因为它符合DBAPI /数据库的要求,是最佳和最有效的验证和强制值来源。
为了构建自己的验证,通常使用TypeDecorator或ORM级验证。TypeDecorator的优点是它在核心运行,并且非常透明,尽管它仅在实际发出SQL时发生。
为了尽早进行验证和强制,这是在ORM级别上。
可以在ORM层通过@validates以下方式进行临时验证:
@validates
http://docs.sqlalchemy.org/en/latest/orm/mapped_attributes.html#simple- validators
@validates使用的事件系统也可以直接使用。您可以编写一个通用的解决方案,将您选择的验证器链接到要映射的类型:
from sqlalchemy import Column, Integer, String, DateTime from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import event import datetime Base= declarative_base() def validate_int(value): if isinstance(value, basestring): value = int(value) else: assert isinstance(value, int) return value def validate_string(value): assert isinstance(value, basestring) return value def validate_datetime(value): assert isinstance(value, datetime.datetime) return value validators = { 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 value class 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字符串强制为unicode:
http://docs.sqlalchemy.org/zh_CN/latest/core/custom_types.html#coercing- encoded-strings-to- unicode