Неявное объявление функции - C99

SQLAlchemy не создает это в том случае, если он отказывается от DBAPI / базы данных как лучший и наиболее эффективный источник проверки и принуждения значений.

Чтобы создать свою собственную проверку, обычно TypeDecorator или ORM- используется валидация уровня. TypeDecorator имеет то преимущество, что он работает в ядре и может быть довольно прозрачным, хотя он возникает только тогда, когда SQL действительно испускается.

Чтобы сделать проверку и принуждение раньше, это на уровне ORM.

Проверка может быть ad-hoc на уровне ORM через @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/en/latest/core/custom_types.html#coercing-encoded-strings -в-юникод

33
задан Pascal 24 August 2011 в 02:00
поделиться