On 01/19/2017 01:53 PM, Samer Atiani wrote:
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?

not sure offhand - you really don't just want to say:

funds = MoneyComposite('funds')

?  sure would be simpler.




--
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
<mailto:sqlalchemy+unsubscr...@googlegroups.com>.
To post to this group, send email to sqlalchemy@googlegroups.com
<mailto:sqlalchemy@googlegroups.com>.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

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