I am porting some code from SQLA .48 to .53 . I have a relation that
works in .48, but not in .53.

At the end of this post is a test program demonstrating the problem.
The program works in .48 but fails in .53 trying to understand the
child1_object relation . The error message says to add foreign_keys to
the relation, but that doesn't seem to actually help.

It does however work if I change the relation to
    child1_object = relation('Child1', backref='others', primaryjoin =
child1_id == Child1.__table__.c.id)
Is making this change the recommended solution? Is the behavior I am
seeing here expected? Is the message telling me to use foreign_keys
bogus?

Here is the code:

#!/usr/bin/python -u
from sqlalchemy import Column, Integer, create_engine, String, ForeignKey
from sqlalchemy.orm import sessionmaker, relation
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    _cls = Column('cls', String(50))
    __mapper_args__ = dict(polymorphic_on = _cls )

class Child1(Parent):
    __tablename__ = 'child1'
    __mapper_args__ = dict(polymorphic_identity = 'child1')
    id = Column(Integer,  ForeignKey('parent.id'), primary_key=True)

class Child2(Parent):
    __tablename__ = 'child2'
    __mapper_args__ = dict(polymorphic_identity = 'child2')
    id = Column(Integer,  ForeignKey('parent.id'), primary_key=True)

class Other(Base):
    __tablename__ = 'other'
    id = Column(Integer, primary_key=True)
    child1_id = Column(Integer, ForeignKey('child1.id'))
    child1_object = relation('Child1', backref='others', primaryjoin =
child1_id == Child1.id)

engine = create_engine('sqlite://')
Base.metadata.create_all(engine)
session = sessionmaker(engine)()

def main():
    child1 = Child1()
    child2 = Child2()
    other = Other()
    child1.others = [other]
    session.add(child1)
    session.add(child2)
    session.add(other)
    session.flush()
    assert 2 == session.query(Parent).count()
    assert child1 == session.query(Other).one().child1_object

if __name__ == '__main__':
    main()

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to [email protected]
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