so my version does work on postgres too (did u try it?).. at least finishes with no errors. or should there be other checks? like what's left in each table?
On Thursday 27 November 2008 10:30:04 David Harrison wrote: > Postgres is the intended deployment platform so it really does need > to work on Postgres, that said last time I dug into this I found > that SQLite is less strict on enforcing key constraints where > Postgres isn't, so technically Postgres is right to complain. > > 2008/11/27 <[EMAIL PROTECTED]>: > > and what that shoud do? attached is a changed version... do see > > if that's what u want (it's sqlite, with plain session). > > the only real change is cascade=all,delete-orphan on > > house.owners... but i just unintentionaly guessed it. > > > > On Thursday 27 November 2008 09:51:38 David Harrison wrote: > >> So this is actually a follow on from a question I posed quite a > >> while back now: > >> > >> http://groups.google.com/group/sqlalchemy/browse_thread/thread/4 > >>530 > >> dffffd3f5585/eb4638599b02577d?lnk=gst&q=Postgres+cascade+error#e > >>b463 8599b02577d > >> > >> So my approach to solving this problem was to use a > >> MapperExtension, but it's giving me the error that I originally > >> posted in this thread. > >> > >> I'm re-posting my previous code here for easy reference and > >> testing by others (with one tiny mod to get rid of the > >> optionparser code I had): > >> > >> --- > >> > >> #!/usr/bin/env python > >> > >> import sys > >> import sqlalchemy as sa > >> import sqlalchemy.orm > >> > >> > >> session = sa.orm.scoped_session( > >> sa.orm.sessionmaker(autoflush=False, transactional=True) > >> ) > >> mapper = session.mapper > >> metadata = sa.MetaData() > >> > >> > >> houseTable = sa.Table( > >> 'house', > >> metadata, > >> sa.Column('id', sa.Integer, primary_key=True), > >> ) > >> > >> ownerTable = sa.Table( > >> 'owner', > >> metadata, > >> sa.Column('id', sa.Integer, primary_key=True), > >> sa.Column('house_id', sa.Integer, > >> sa.ForeignKey('house.id')), ) > >> > >> dogTable = sa.Table( > >> 'dog', > >> metadata, > >> sa.Column('id', sa.Integer, primary_key=True), > >> sa.Column('house_id', sa.Integer, > >> sa.ForeignKey('house.id')), ) > >> > >> friendshipTable = sa.Table( > >> 'friendship', > >> metadata, > >> sa.Column('id', sa.Integer, primary_key=True), > >> sa.Column('owner_id', sa.Integer, > >> sa.ForeignKey('owner.id')), sa.Column('dog_id', sa.Integer, > >> sa.ForeignKey('dog.id')), ) > >> > >> > >> class House(object): pass > >> class Owner(object): pass > >> class Dog(object): pass > >> class Friendship(object): pass > >> > >> > >> mapper( > >> House, > >> houseTable, > >> properties = { > >> "owners" : sa.orm.relation( > >> Owner, cascade="delete-orphan" > >> ), > >> "dogs" : sa.orm.relation( > >> Dog, cascade="delete-orphan" > >> ), > >> }, > >> ) > >> mapper( > >> Owner, > >> ownerTable, > >> properties = { > >> "friendships" : sa.orm.relation( > >> Friendship, cascade="delete" > >> ), > >> }, > >> ) > >> > >> mapper( > >> Friendship, > >> friendshipTable, > >> properties = { > >> "dog" : sa.orm.relation( > >> Dog, uselist=False, cascade="all, delete-orphan" > >> ), > >> }, > >> ) > >> > >> mapper(Dog, dogTable) > >> > >> > >> if __name__ == "__main__": > >> > >> engine = sa.create_engine( > >> "postgres://test:[EMAIL PROTECTED]/test", > >> strategy="threadlocal", > >> echo=True > >> ) > >> metadata.bind = engine > >> session.configure(bind=engine) > >> > >> print "Creating tables" > >> metadata.create_all() > >> > >> print "Seeding database" > >> for i in range(10): House() > >> session.flush() > >> > >> for house in sa.orm.Query(House).all(): > >> for i in range(2): > >> owner = Owner() > >> house.owners.append(owner) > >> session.flush() > >> > >> for house in sa.orm.Query(House).all(): > >> for i in range(2): > >> dog = Dog() > >> house.dogs.append(dog) > >> session.flush() > >> > >> for owner in sa.orm.Query(Owner).all(): > >> for dog in sa.orm.Query(Dog).filter_by(house_id = > >> owner.house_id).all(): friendship = Friendship() > >> friendship.dog = dog > >> owner.friendships.append(friendship) > >> session.commit() > >> > >> owner = sa.orm.Query(Owner).first() > >> for f in owner.friendships: > >> print "FRIENDSHIP: %s || DOG: %s" % (f.id, f.dog.id) > >> > >> print "Deleting owner" > >> session.delete(owner) > >> session.flush() > >> session.commit() > >> > >> 2008/11/27 David Harrison <[EMAIL PROTECTED]>: > >> > Sorry, I should probably have mentioned that C isn't the only > >> > object that maps A, so a cascade doesn't work. > >> > > >> > 2008/11/27 <[EMAIL PROTECTED]>: > >> >> i'm not expert on these, but i think u need something like > >> >> cascade='all' on your relation, _instead_ of the mapperExt. > >> >> check the docs about possible settings. the mapperExt fires > >> >> too late and the session flush-plan gets surprised. > >> >> > >> >> On Thursday 27 November 2008 08:15:04 David Harrison wrote: > >> >>> Hey all, > >> >>> > >> >>> I've got a situation where I have 2 object A and B, and a > >> >>> third object C that has a foreign key reference to both A > >> >>> and B. I can have many C's that map to the same A. > >> >>> > >> >>> Now I've implemented a MapperExtension for C that has an > >> >>> after_delete function, and that function checks to see if > >> >>> the A that the deleted C was mapped to has any other > >> >>> mappings, and if there are no other mappings left, deletes > >> >>> the A. > >> >>> > >> >>> Now this works fine if I'm just deleting C's directly, > >> >>> however as soon as this happens during a cascade delete from > >> >>> some other object D that happens to have a mapping to C I > >> >>> get the below error - I'm assuming this is because > >> >>> sqlalchemy has a test condition that doesn't see my mapper > >> >>> coming, and freaks out when extra rows get nuked. > >> >>> > >> >>> "ConcurrentModificationError: Deleted rowcount 0 does not > >> >>> match number of objects deleted 4" > >> >>> > >> >>> Help ? > >> >>> > >> >>> Cheers > >> >>> Dave > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com 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 -~----------~----~----~----~------~----~------~--~---