I would like to allow some of the CompositeProperty columns I'm building to 
get their names dynamically, in a manner that mirrors how columns get their 
names in sqlalchemy's declarative mapper. The best way I found to implement 
this behavior is to do the following:

class DeferredCompositeProperty(CompositeProperty):
    def get_column_names(self, key):
        raise NotImplementedError

    def undefer_column_names(self, key):
        for col, name in zip(self.columns, self.get_column_names(key)):
            col.name = name
            col.key = name

class CustomDeclarativeMeta(DeclarativeMeta):
    def __new__(cls, name, bases, d):
        def undefer(k, v):
            if isinstance(v, DeferredCompositeProperty):
                v.undefer_column_names(k)

        for k, v in d.iteritems():
            undefer(k, v)

        for base in bases:
            for k, v in base.__dict__.iteritems():
                undefer(k, v)

        return DeclarativeMeta.__new__(cls, name, bases, d)

class MoneyComposite(DeferredCompositeProperty):
def __init__(self):
DeferredCompositeProperty.__init__(self, <SomeCompositeClass>, 
Column(Integer), Column(String))
def get_column_names(self, key):
return [
'{}_amount'.format(key),
‘{}_currency’.format(key)
]
Base = declarative_base(metaclass=CustomDeclarativeMeta)

class ExampleModel(Base):
funds = MoneyComposite()


This would result in ExampleModel having the columns: funds_amount and 
funds_currency automatically without having to specify them directly.

Am I doing this right or is there a better way?

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to