row switch logic fails with relations

Issue #841 resolved
Mike Bayer repo owner created an issue
#!/usr/bin/env python

from sqlalchemy import *
from sqlalchemy.orm import *

e = create_engine("sqlite://", echo=True)
metadata = MetaData(e)

session = create_session()
transaction = session.create_transaction()

addresses_table = Table('Address', metadata,
    Column('id', Integer, primary_key = True),
    Column('street', Unicode(250)),
)

users_table = Table('users', metadata,
    Column('id', Integer, primary_key = True),
    Column('name', Unicode(80)),
)

mapping_table = Table('users_addresses__Address', metadata,
    Column("user_id", Integer, ForeignKey("users.id")),
    Column("Address_id", Integer, ForeignKey("Address.id"))
)


class Address(object):
    def __repr__(self):
        return unicode(self.street)

class User(object):
    def __repr__(self):
        return unicode(self.name)

mapper(Address, addresses_table)

mapper(User, users_table, 
    properties={'addresses': 
        relation(Address, 
                 secondary=mapping_table, 
                 primaryjoin=users_table.c.id==mapping_table.c.user_id,
                 secondaryjoin=mapping_table.c.Address_id==addresses_table.c.id)
    }
)


metadata.drop_all()
metadata.create_all()


a = Address()
a.street="Wall Street"
u = User()
u.id = 1
u.name="Foo Bar"
u.addresses.append(a)

session.save(a)
session.save(u)

transaction.commit()


metadata.bind.echo = True
session = create_session()
transaction = session.create_transaction()


foo = session.query(User).filter_by(name='Foo Bar').one()

for address in foo.addresses:
    foo.addresses.remove(address)
    session.delete(address)
session.delete(foo)

foo = User()
session.save(foo)
foo.id = 1  # triggers row switch, above address m2m rows don't get deleted properly
foo_addr = Address()
session.save(foo_addr)
foo_addr.street = "Picadelly Circus"
foo.addresses.append(foo_addr)

transaction.commit()

Comments (2)

  1. Log in to comment