now I have a real question based on example 1 above.

i.e. wanting an object with the following attributes:

customer.o_cutype
customer.id
customer.type   (converted from cutype through mapping function)

from

create table old_customer (cunr number, cutype char(1));

The following works:

PREFIX = 'o_'

class Customer(Base):
    __tablename__   = 'old_customer'
    __table_args__  = {'autoload':True}
    __mapper_args__ = {'column_prefix' : PREFIX}

    id = Column('cunr', Integer, primary_key=True)

    def _get_type(self):
        def mapping(x):
            return ord(x)
        return mapping(self.o_cutype)
    type = synonym('o_cutype', descriptor=property(_get_type))

Session = sessionmaker()
session = Session()

customer = session.query(Customer).filter_by(id=1).one()

print customer.id
print 'type mapping %s -> %d' % (customer.o_cutype, customer.type)



Then when I want to make the mapping / transformation more generic..
e.g. by just supplying a list like:
    __transforms__  = [ ('cutype', 'type', lambda x:ord(x)) ]

 I came up with the following which seems to work:


from sqlalchemy import *
from sqlalchemy.orm import sessionmaker, synonym
from sqlalchemy.ext.declarative import declarative_base,
DeclarativeMeta

engine=create_engine('oracle://gw_val:[EMAIL PROTECTED]')
Base = declarative_base(engine=engine)

PREFIX = 'o_'

def make_getter(oldname, fn):
    def getter(self):
        return fn(getattr(self, PREFIX + oldname))
    return getter

class MyMeta(DeclarativeMeta):

    def __new__(meta, classname, bases, classdict):

        for oldname, newname, fn in classdict['__transforms__']:
            getter = make_getter(oldname, fn)
            classdict['_get_' + newname] = getter
            classdict[newname] = synonym(PREFIX + oldname,
descriptor=property(getter))

        return type.__new__(meta, classname, bases, classdict)

class Customer(Base):
    __metaclass__   = MyMeta
    __transforms__  = [ ('cutype', 'type', lambda x:ord(x)) ]
    __tablename__   = 'old_customer'
    __table_args__  = {'autoload':True}
    __mapper_args__ = {'column_prefix' : PREFIX}

    id = Column('cunr', Integer, primary_key=True)


    #def _get_type(self):
        #def mapping(x):
            #return ord(x)
        #return mapping(self.o_cutype)
    #type = synonym('o_cutype', descriptor=property(_get_type))


Session = sessionmaker()
session = Session()

customer = session.query(Customer).filter_by(id=1).one()

print customer.id
print 'type mapping %s -> %d' % (customer.o_cutype, customer.type)


Question is - Is this recommended, am I overcomplicating things with
the metaclass?


--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to