Cool, thank you. Due to the bug I moved away from mapping a selectable to do the job. But I'll keep in mind what you've said.
On Tue, Dec 7, 2010 at 9:01 PM, Michael Bayer <[email protected]> wrote: > its a bug, and theres a new ticket http://www.sqlalchemy.org/trac/ticket/1997 > with a small patch. > > I would suggest maybe not using composites for this for now. Most of what > composite does you can accomplish using descriptors: > > class Value(object): > �...@property > def custom_values(self): > return CustomValue(self.v1, self.v2) > > �...@custom_values.setter > def custom_values(self, value): > self.v1 = value.v1 > self.v2 = value.v2 > > I considered replacing the mechanism of composite with the above type of > thing in 0.7 but there were still some edge cases that composites seem to > have. > > > > On Dec 7, 2010, at 1:54 PM, Will wrote: > >> from sqlalchemy import create_engine >> from sqlalchemy.orm import sessionmaker, mapper, relationship, >> composite >> from sqlalchemy.schema import Table, Column, MetaData, ForeignKey >> from sqlalchemy.sql import select >> from sqlalchemy.types import Integer, Text >> >> engine = create_engine('sqlite:///') >> session = sessionmaker(bind=engine, autocommit=True)() >> metadata = MetaData(engine) >> >> >> # Tables >> descriptions_table = Table('descriptions', metadata, >> Column('id', Integer, primary_key=True), >> Column('d1', Text), >> Column('d2', Text), >> ) >> >> values_table = Table('values', metadata, >> Column('id', Integer, primary_key=True), >> Column('description_id', Integer, ForeignKey('descriptions.id'), >> nullable=False), >> Column('v1', Text), >> Column('v2', Text), >> ) >> >> desc_values = select( >> [values_table, descriptions_table.c.d1, descriptions_table.c.d2], >> descriptions_table.c.id == values_table.c.description_id >> ).alias('descriptions_values') >> >> >> # Classes >> class Descriptions(object): >> pass >> >> >> class Values(object): >> pass >> >> >> class CustomValues(list): >> >> def __init__(self, *args): >> self.extend(args) >> >> def __composite_values__(self): >> return self >> >> >> # Mappers >> mapper(Descriptions, descriptions_table, properties={ >> 'values': relationship(Values, lazy='dynamic'), >> 'custom_descriptions': composite(CustomValues, >> descriptions_table.c.d1, >> descriptions_table.c.d2), >> }) >> >> mapper(Values, desc_values, properties={ >> 'custom_descriptions': composite(CustomValues, desc_values.c.v1, >> desc_values.c.v2), >> }) >> >> >> # Testing >> metadata.create_all() >> engine.echo = True >> >> >> descriptions = Descriptions() >> descriptions.custom_descriptions = CustomValues('Color', 'Number') >> >> values1 = Values() >> values1.custom_values = CustomValues('Red', '5') >> >> values2 = Values() >> values2.custom_values = CustomValues('Blue', '1') >> >> descriptions.values.append(values1) >> descriptions.values.append(values2) >> >> session.add(descriptions) >> session.flush() > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to [email protected]. > 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. > > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to [email protected]. 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.
