polymorphic_on identity value not inserted if the 'on' column is a member of the primary key

Issue #1300 resolved
jek created an issue
from sqlalchemy import *
from sqlalchemy.orm import *


def test(use_composite_pk):
    metadata = MetaData('sqlite:///')

    parents = Table('parents', metadata,
                    Column('id', Integer, primary_key=True),
                    Column('name', String(60)))
    children = Table('children', metadata,
                     Column('id', Integer, ForeignKey('parents.id'),
                            primary_key=True, nullable=False),
                     Column('type', Integer,
                            primary_key=use_composite_pk,
                            nullable=False),
                     Column('name', String(60)))
    metadata.create_all()

    class Parent(object):
        def __init__(self, name=None):
            self.name = name

    class Child(object):
        def __init__(self, name=None):
            self.name = name

    class A(Child): pass


    mapper(Parent, parents, properties={
        'children': relation(Child, backref='parent'),
        })
    mapper(Child, children, polymorphic_on=children.c.type,
           polymorphic_identity=1)
    mapper(A, inherits=Child, polymorphic_identity=2)


    s = create_session()
    p = Parent('p1')
    a = A('a1')
    p.children.append(a)
    s.add(p)
    s.flush()

    assert a.id
    assert a.type

print "1 col pk"
test(False)
print "2 col pk"
test(True)

Comments (5)

  1. Mike Bayer repo owner
    • removed status
    • changed milestone to 0.5.6
    • changed status to open

    fails (per #1478):

    Index: test/orm/inheritance/test_basic.py
    ===================================================================
    --- test/orm/inheritance/test_basic.py  (revision 6121)
    +++ test/orm/inheritance/test_basic.py  (working copy)
    @@ -985,7 +985,15 @@
             assert a.id
             assert a.type == 2
    
    +        p.name='p1new'
    +        a.name='a1new'
    +        s.flush()
    
    +        s.expire_all()
    +        assert a.name=='a1new'
    +        assert p.name=='p1new'
    +        
    +        
     class DeleteOrphanTest(_base.MappedTest):
         @classmethod
         def define_tables(cls, metadata):
    
  2. Log in to comment