Definitely simpler :)
On Thu, Jan 19, 2017 at 16:23 mike bayer <[email protected]> wrote:
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 [email protected]
> <mailto:[email protected]>.
> To post to this group, send email to [email protected]
> <mailto:[email protected]>.
> 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 a topic in the
Google Groups "sqlalchemy" group.
To unsubscribe from this topic, visit
https://groups.google.com/d/topic/sqlalchemy/snArVxEm4mA/unsubscribe.
To unsubscribe from this group and all its topics, send an email to
[email protected].
To post to this group, send email to [email protected].
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 [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.