I'm using session.add() to refresh my objects while working on them,
because I don't want to merge them with the persistent state.  But it
appears deletes aren't carrying across to child relations:


$ cat listdelete.py; python listdelete.py

import sqlalchemy as sql
from sqlalchemy import orm
from sqlalchemy.ext.declarative import declarative_base

echo = 0
engine = sql.create_engine("sqlite:///:memory:", echo=bool(echo))
metadata = sql.MetaData(bind=engine)
DB = orm.sessionmaker(bind=engine)
T = declarative_base(metadata=metadata)

class A(T):
    __tablename__ = 'a'
    id = sql.Column(sql.Integer, primary_key=True)
    info = sql.Column(sql.String)
    cc = orm.relation('C',
                      backref='a',
                      cascade='all,delete-orphan')
    def __repr__(self):
        return " >> a: %s cc=%s" % (self.info, len(self.cc))

class C(T):
    __tablename__ = 'c'
    a_id = sql.Column(sql.Integer, sql.ForeignKey('a.id'),
primary_key=True)
    i = sql.Column(sql.Integer, primary_key=True)

def get():
    return DB().query(A).first()

def change(a, s, i):
    orm.object_session(a).close()
    db = DB()
    db.add(a)
    a.info = s
    del a.cc[-1]
    a.cc.append(C(i=i))
    db.close()

metadata.create_all()
A.__table__.delete().execute()

db = DB()
a = A(id=1, info='blah', cc=[C(i=1), C(i=2)])
db.add(a)
db.commit()
db.close()

print get()

# merge and flush
a = get()
change(a, 'change one', 3)
db = DB()
db.merge(a)
db.commit()
db.close()

print get()

# add and flush
a = get()
change(a, 'change two', 4)
db = DB()
db.add(a)
db.commit()
db.close()

print get()


 >> a: blah cc=2
 >> a: change one cc=2
 >> a: change two cc=3

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to