Hello List, I have two (related) questions hiding below:
The enclosed code makes mappers with (edit + re-run please) . default cascade rules . cascade='all' . cascade='all, delete-orphan' It tries to test u = User(); e = Email(); u.append(e) ; sess.fluhs() # works always session.delete(u) # works if any cascade specified # and *always* deletes Emails # even *without* delete-orphan Q1: delete-orphan doesn't change the behaviour here. *but* u = User() ; u.name = 'giorgos' ; sess.save(u) ; session.flush() # ok e = Email() e.user_id = u.user_id # uid = 1 sess.save(e) ; sess.flush() # fails with cascade=all, delete- orphan sess.delete(u) # deletes orphans even with only cascade='all' # tries (and fails, which is ok) with no cascade rules (because # nullalble = False) Q2: only cascade = 'all' works. if we have delete-orphan, we cannot create an object and forcibly stuff the parent's ID in the relevant column. if we have no cascade, it tries to set email.user_id = Null, which fails. The Code... ---------------------- from sqlalchemy import * db = create_engine('sqlite:///temp.db') meta = BoundMetaData(db) meta.engine.echo = True user_table = Table('users', meta, Column('user_id', Integer, primary_key=True), Column('name', String, nullable=False) ) email_table = Table('emails', meta, Column('email_id', Integer, primary_key=True), Column('user_id', Integer, ForeignKey('users.user_id'), nullable=False) ) meta.drop_all() user_table.create() email_table.create() class User(object): pass class Email(object): pass mapper(User, user_table ,properties={ 'emails' : relation(Email #,cascade='all' # WORKS ,cascade='all, delete-orphan' # FAILS ) } ) mapper(Email, email_table) session = create_session() if 0: # works always u = User() ;u.name = 'giorgos' e = Email() u.emails.append(e) session.save(u) # note: no need to save e ! session.flush() # let's check deletions get cascaded session.delete(u) # deletes email session.flush() if 1: # works with cascade = 'all', fails with cascade = 'all, delete- orphan' u = User() ; u.name = 'giorgos' session.save(u) session.flush() print 'uid:',u.user_id e = Email() e.user_id = u.user_id session.save(e) session.flush() # fails if cascade='all, delete-orphan' # let's check deletions get cascaded session.delete(u) # deletes email session.flush() # fails if no cascade options set. --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---