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
-~----------~----~----~----~------~----~------~--~---

Reply via email to