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 [email protected]
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
-~----------~----~----~----~------~----~------~--~---