i've got a handful of bad data from some edge cases and have been having trouble querying the data with sqlalchemy. i attached a SSCCE below.
my cleanup script imports the model, extends `Main_Foo` with a new relationship, and creates 2 aliases. this selects the right rows (2 and 4) but the relationship is populated with the "local side" data, not the "remote side" data i'm sure I'm missing something obvious. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Standard imports import sqlalchemy import sqlalchemy.orm from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Integer, Column, Unicode # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # You probably don't need to overwrite this Base = declarative_base() # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Define some models that inherit from Base class Main_Foo(Base): __tablename__ = 'main_foo' id = Column(Integer, primary_key=True) id_foo_alt = Column(Integer) name = Column(Unicode) # need to define these separately as they're in a new script that overwrites the model Main_Foo.foo_alt = sqlalchemy.orm.relationship( "Main_Foo", primaryjoin="Main_Foo.id_foo_alt==remote(foreign(Main_Foo.id))", uselist=False, ) Foo = sqlalchemy.orm.aliased(Main_Foo, name='foo') Foo_2 = sqlalchemy.orm.aliased(Main_Foo, name='foo2') # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # set the engine engine = sqlalchemy.create_engine('sqlite:///:memory:', echo=True) Base.metadata.create_all(engine) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # do a simple query to trigger the mapper error sessionFactory = sqlalchemy.orm.sessionmaker(bind=engine) s = sessionFactory() rows = ((1, None, 'a (ab)'), (2, 1, 'b (ab)'), (3, None, 'c (cd)'), (4, 3, 'd (cd)'), (5, None, 'e'), (6, 'x', 'f'), (7, 'x', 'g'), ) for row in rows: f = Main_Foo() f.id = row[0] f.id_foo_alt = row[1] f.name = row[2] s.add(f) s.flush() s.commit() qedge_case = s.query(Foo)\ .join(Foo_2, Foo.id_foo_alt == Foo_2.id )\ .filter(Foo_2.name.op('IS NOT')(None), )\ .options(sqlalchemy.orm.contains_eager('foo_alt'))\ .order_by(Foo.id.asc()) for f in qedge_case.all(): print "---" print f.id print " %s %s" % (f.id, f.name) print " > >" print " %s %s" % (f.foo_alt.id, f.foo_alt.name) -- 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.