On Jan 29, 1:49 am, Julien Cigar <[EMAIL PROTECTED]> wrote: > Michael Bayer wrote: > > On Jan 24, 1:50 am, "chris e" <[EMAIL PROTECTED]> wrote: > > >> I am planning on using sqlalchemy to build the api for a database I am > >> developing, and I was wondering if there is any type of column > >> verification that occurs before database commit. > > >> I.E.: a string column with length 40 would throw a verification > >> exception if a value longer that 40 characters was placed into it and > >> saved. > > > your database will throw an error. why reinvent the wheel ? > > >> Additionally has anyone thought of implementing some sort of > >> verification support for objects that are mapped which would allow the > >> object to perform pre database action logic? The intent being that the > >> instance would check to see that the object meets additional business > >> logic requirements before it is inserted or updated. > > >> I.E.: a User business object would verify that the userid was part of > >> the [a-z] [A-Z]and [0-9] character classes, and if not an exception > >> would be raised to prevent the database action. > > > thats exactly the kind of thing you should write into your > > application. has nothing to do with an ORM. for generic validation > > widgets to help, check out formencode (http://formencode.org/).(Just to > > share a method which woks well for me :) > > What I usually to perform validation is to create a property() > (_set_attribute(), _get_attribute()) for each mapped column, then I use > the column_prefix="_" attribute in SQLAlchemy. > After that I have a function which iterate on the columns > (YourMappedObject.c.keys()) and use a try / except with a setattr (it's > a bit more sophisticated than that in fact), for example : > > assign_mapper(session_context, Language, table_languages, column_prefix='_') > > class Language(object): > > def _set_iso_code(self, value): > try: > value = ''.join(value.split()).lower() > except AttributeError: > raise Invalid('iso code must be a string') > if len(value) == 2: > self._iso_code = value > else: > raise Invalid('Invalid iso code') > > def _get_iso_code(self): > return self._iso_code > > iso_code = property(_get_iso_code, _set_iso_code) > > (...) > > then I do something like (not complete): > def populate(MappedObject, values): > errors = [] > for c in MappedObject.c.keys(): > value = values.get(c, Undefined()) > if value is not Undefined: > try: > setattr(MappedObject, c , value) > except Invalid, e: > errors.append(str(e)) > return errors > > also, I have in my models a __before_save__ / __before_update__ which > check additional things like NOT NULL constraints (!None), ... > > -- > Julien Cigar > Belgian Biodiversity Platformhttp://www.biodiversity.be > Université Libre de Bruxelles > Campus de la Plaine CP 257 > Bâtiment NO, Bureau 4 N4 115C (Niveau 4) > Boulevard du Triomphe, entrée ULB 2 > B-1050 Bruxelles > office: [EMAIL PROTECTED] > home: [EMAIL PROTECTED] Thanks for the info. After I did a bit more reading I realised that I would have to build a custom mapper, I will definitely take your suggestions into account when I write it. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---