uow not correctly figuring out collection with single_parent=True

Issue #2314 resolved
Mike Bayer repo owner created an issue

related to #2264, even without the backref the UOW is inconsistent

from sqlalchemy.orm import unitofwork, session, mapper, dependency
from sqlalchemy.util import topological
from test.lib.util import RandomSet
topological.set = unitofwork.set = session.set = mapper.set = dependency.set = RandomSet

from sqlalchemy import *
from sqlalchemy.orm import *

engine = create_engine('sqlite:///', echo=True) 
metadata = MetaData(engine)
Session = sessionmaker(bind=engine)

rocks_table = Table("rocks", metadata,
    Column("id", Integer, primary_key=True),
)

bugs_table = Table("bugs", metadata,
    Column("rockid", Integer, ForeignKey('rocks.id'), primary_key=True,),
    Column("id", Integer, primary_key=True),
)

class Rock(object):
    pass

class Bug(object):
    pass


mapper(Rock, rocks_table,
    properties={'bugs': relationship(Bug,
                    cascade='all,delete-orphan', 
                    single_parent=True,
                    lazy=False,
                    #backref='rock'
                    )
                })

mapper(Bug, bugs_table)

metadata.create_all()

session = Session()

rock=Rock()
rock.id = 1
bug=Bug()
bug.id = 1
rock.bugs.append(bug)
session.add(rock)

# add another rock and bug
rock=Rock()
rock.id = 2
bug=Bug()
bug.id = 2
rock.bugs.append(bug)
session.add(rock)

session.commit()
session.expunge_all()


session = Session()


currentobjects = session.query(Rock).all()

allbugs = session.query(Bug).all()
r1 = session.query(Rock).get(1)
r1.bugs = allbugs

r2 = session.query(Rock).get(2)
r2.bugs = []

# flush incorrectly DELETES bug...sometimes !
session.flush()

assert session.query(Bug).count() == 2

Comments (2)

  1. Log in to comment