E 'più facile per rinominare solo la colonna mappata e procura attraverso una proprietà:
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
Si può facilmente scomporre la creazione di proprietà, e anche utilizzare un quadro di convalida generico come FormEncode .
Se avete bisogno di una soluzione specifica più SQLAlchemy e non mente utilizzando interfacce specifiche, quindi SQLAlchemy ha un meccanismo di estensione per catturare gli eventi su attributi. Un validatore usando che sarebbe simile a questa:
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
Si potrebbe quindi utilizzare questa estensione impostando __sa_instrumentation_manager__ = InstallValidatorListeners
su qualsiasi classe che si desidera convalidato. Puoi anche impostarlo sulla classe Base se vuoi che venga applicato a tutte le classi derivate da esso.
fonte
2010-02-23 11:55:16
Si prega di indicare il codice che si sta utilizzando per definire il tavolo e la mappatura alla classe. AFAIK, il database dovrebbe generare un errore che si propaga di nuovo attraverso SQLAlchemy. Si prega di inviare il codice per fornire qualche suggerimento su ciò che stai provando ora. –
@ S.Lott MySQL non controlla la lunghezza della stringa su insert/update. Tronca silenziosamente stringhe troppo lunghe. – codeape