composites of composites aren't supported directly so you'd have to
map out all the columns for "street" directly, then define a
constructor that handles the columns:

class Address(object):
  def __init__(self, name, value, towndetail):
    self.name = name
    self.value = value
    self.towndetail = towndetail

  @classmethod
  def generate(cls, a, b, c, d):
    return Address(a, b, TownDetail(c, d))

  def __composite_values__(self):
    return (self.name, self.value) + self.towndetail.__composite_values__()

  def __eq__(self, other):
    return isinstance(other, self.__class__) and\
        make_dump(self) == make_dump(other)

  def __ne__(self, other):
    return not self.__eq__(other)

...

class TestComposite(Base):
...
  towndetail = composite(TownDetail, _street_address_town_detail_name,
_street_address_town_detail_value)
  street = composite(Address.generate, _street_address_name,
_street_address_value, _street_address_town_detail_name,
_street_address_town_detail_value)

that trick using "Address.generate" isn't documented right now.   I
just discovered it :).   Another way would be make Address.__init__
know how to handle both sets of arguments.


On Tue, Dec 11, 2018 at 12:18 AM Tolstov Sergey <whistler...@gmail.com> wrote:
>
> Can someone have example of this?
> Example is
> class TownDetail(object):
>   def __init__(self, name, value):
>     self.name = name
>     self.value = value
>
>   def __composite_values__(self):
>     return self.name, self.value
>
>   def __eq__(self, other):
>     return isinstance(other, self.__class__) and\
>         make_dump(self) == make_dump(other)
>
>   def __ne__(self, other):
>     return not self.__eq__(other)
>
>
> class Address(object):
>   def __init__(self, name, value, towndetail):
>     self.name = name
>     self.value = value
>     self.towndetail = towndetail
>
>   def __composite_values__(self):
>     return self.name, self.value
>
>   def __eq__(self, other):
>     return isinstance(other, self.__class__) and\
>         make_dump(self) == make_dump(other)
>
>   def __ne__(self, other):
>     return not self.__eq__(other)
>
> class TestComposite(Base):
>   __tablename__ = 'test_composite'
>   id = sqlalchemy.Column(sqlalchemy.types.Integer, primary_key=True)
>   name = sqlalchemy.Column(sqlalchemy.types.String)
>   _street_address_name = sqlalchemy.Column(sqlalchemy.types.String)
>   _street_address_value = sqlalchemy.Column(sqlalchemy.types.Integer)
>   _street_address_town_detail_name = 
> sqlalchemy.Column(sqlalchemy.types.String)
>   _street_address_town_detail_value = 
> sqlalchemy.Column(sqlalchemy.types.Integer)
>
>
>   towndetail = composite(TownDetail, _street_address_town_detail_name, 
> _street_address_town_detail_value)
>   street = composite(Address, _street_address_name, _street_address_value, 
> towndetail)
>
>
> test_instance = TestComposite(
>     name='tratata!', street=Address(name=22, value='values', 
> towndetail=TownDetail(322, '322')))
>
> Error is
>
> sqlalchemy.exc.ArgumentError: Composite expects Column objects or mapped 
> attributes/attribute names as arguments, got: <CompositeProperty at 
> 0x7f7aa0a75d68; towndetail>
>
> have some info in here, but cannot undestand what to do. No access to full 
> example bucket
>
> --
> 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.

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