On Wed, Jan 3, 2018 at 7:48 PM, Mike Bayer <[email protected]> wrote:
> didn't look close yet but you wouldn't want to have foreign() on a
> column that is a primary key column. should be on the opposite side
> of whatever refers to a primary key.
that and, when you use contains_eager you need to tell it what entity
it's looking for when it considers columns as part of a relationship:
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', alias=Foo_2))\
.order_by(Foo.id.asc())
>
> On Wed, Jan 3, 2018 at 6:28 PM, Jonathan Vanasco <[email protected]>
> wrote:
>> 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 [email protected].
>> To post to this group, send email to [email protected].
>> Visit this group at https://groups.google.com/group/sqlalchemy.
>> For more options, visit https://groups.google.com/d/optout.
--
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 [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.