eager aliasing, maybe *should* dig into scalar selects
Issue #948
resolved
in contradiction to #947:
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy import exceptions
import datetime
meta = MetaData(create_engine('sqlite://', echo=True))
users = Table('users', meta,
Column('id', Integer, primary_key=True),
Column('name', String(50))
)
stuff = Table('stuff', meta,
Column('id', Integer, primary_key=True),
Column('date', Date),
Column('user_id', Integer, ForeignKey('users.id')))
meta.create_all()
users.insert().execute(
{'id':1, 'name':'user1'},
{'id':2, 'name':'user2'},
{'id':3, 'name':'user3'},
)
stuff.insert().execute(
{'id':1, 'user_id':1, 'date':datetime.date(2007, 10, 15)},
{'id':2, 'user_id':1, 'date':datetime.date(2007, 12, 15)},
{'id':3, 'user_id':1, 'date':datetime.date(2007, 11, 15)},
{'id':4, 'user_id':2, 'date':datetime.date(2008, 1, 15)},
{'id':5, 'user_id':3, 'date':datetime.date(2007, 6, 15)},
)
class User(object):
def __repr__(self):
return "User %r, stuff: %r" % (self.id, self.stuff)
class Stuff(object):
def __repr__(self):
return "Stuff %r" % self.id
mapper(Stuff, stuff)
salias = stuff.alias()
stuff_view = select([func.max(salias.c.date).label('max_date')](func.max(salias.c.date).label('max_date'))).where(salias.c.user_id==users.c.id).correlate(users)
mapper(User, users, properties={
'stuff':relation(Stuff, primaryjoin=and_(users.c.id==stuff.c.user_id, stuff.c.date==(stuff_view.label('foo'))))
})
sess = create_session()
# breaks, because the correlate(users) doesnt get hit by the aliasing
print sess.query(User).options(eagerload('stuff')).one()
Comments (4)
-
reporter -
reporter - changed milestone to 0.5.xx
-
reporter - changed status to resolved
full tests added in 0465d0b880be6ae13feeed98b93d2e1d2fdec773.
-
reporter - removed milestone
Removing milestone: 0.5.xx (automated comment)
- Log in to comment
if you remove the
correlate()
, then it works, because auto-correlation takes over. so this is just limited to the "correlate" function needing to take cloned parents into account.