I can't make this work with my relation:

mapper(Warehouse, warehouse_table,properties = {
    'translation':  relation(
                                WarehouseTranslation,
                                lazy = False,
                                uselist = False,
                                primaryjoin=
                                    and_(
                                        warehouse_table.c.id ==
warehouse_translation_table.c.warehouse_id,
 
warehouse_translation_table.c.language_id==common.get_language(),
                                        # I want limit 1 here
                                        ),
                            ),
.... rest relations
an aditional subselect will just make it work slower.

On 17 Paź, 21:57, Michael Bayer <[EMAIL PROTECTED]> wrote:
> On Oct 17, 2008, at 3:32 PM, g00fy wrote:
>
>
>
> > hi,
> > on Mapper() i have relation() i use primaryjoin, and uselist=False,
> > but i also want to have LIMIT=1 on my join
> > it would be much faster!!
> > SA should add the limit itself when uselist=False
>
> uselist=False is intended for a one-to-one relation where there is  
> only one child row referencing the parent row.  It's not used to limit  
> the size of a collection that is otherwise many elements.
>
> Since it seems you're wrestling with a large collection, your best  
> option may be to use a "dynamic" loader which allows any query  
> criterion to be used with an ordinary mapped attribute.  This is  
> described in:  
> http://www.sqlalchemy.org/docs/05/mappers.html#advdatamapping_relatio...
>
> Another option would include setting up your primaryjoin to issue  
> criterion which matches the exact row you're looking for.  Here's an  
> example:
>
> from sqlalchemy import *
> from sqlalchemy.orm import *
>
> engine = create_engine('sqlite://', echo=True)
> metadata =MetaData(engine)
> item = Table('item', metadata,
>      Column('id', Integer, primary_key=True),
>      Column('parent_id', Integer, ForeignKey('parent.id'))
> )
>
> parent = Table('parent', metadata,
> Column('id', Integer, primary_key=True),
>
> )
>
> metadata.create_all()
>
> engine.execute("insert into parent values(1)")
> engine.execute("insert into parent values(2)")
> engine.execute("insert into item values(1, 1)")
> engine.execute("insert into item values(2, 1)")
> engine.execute("insert into item values(3, 1)")
> engine.execute("insert into item values(4, 1)")
> engine.execute("insert into item values(5, 2)")
> engine.execute("insert into item values(6, 2)")
> engine.execute("insert into item values(7, 2)")
>
> class Parent(object):
>      pass
>
> class Item(object):
>      pass
>
> mapper(Parent, parent, properties={
>      'item':relation(Item, uselist=False,
>
> primaryjoin
> =
> item
> .c
> .id
> =
> =
> select
> ([func
> .max
> (item
> .c
> .id
> )]).where
> (item.c.parent_id==parent.c.id).correlate(parent).as_scalar(),  
> viewonly=True
>      )})
>
> mapper(Item, item)
>
> sess = create_session()
>
> p2 = sess.query(Parent).get(2)
> assert p2.item.id == 7
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to