eager aliasing, maybe *should* dig into scalar selects

Issue #948 resolved
Mike Bayer repo owner created an issue

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)

  1. Mike Bayer reporter

    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.

  2. Log in to comment