Il 06/08/11 00.32, Aviv Giladi ha scritto:
Hi Stefano,
I create and add a Rating and Subrating (both end up in the DB no
problem).
Then, I call session.delete(rating_obj) and commit it. I look at the
DB, and the Rating is gone, but the SubRating is still there.
The DB shows that the Rating has the correct Subrating's ID..


Hi Aviv,
I attached the code you sent me.

I move 'cascade' as I told you and everything works. See the log that I pasted at the bottom of the script.


--
Ing. Stefano Fontanelli
Asidev S.r.l.
Via Osteria Bianca, 108/A 50053 Empoli (Firenze)
Tel. (+39) 333 36 53 294   Fax. (+39) 0571 1 979 978
E-mail: s.fontane...@asidev.com   Web: www.asidev.com
Skype: stefanofontanelli

--
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 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

from sqlalchemy import *
from sqlalchemy.orm import backref
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base


Base = declarative_base()


subrating_subratingproperty = Table('subrating_subratingproperty_association',
                                    Base.metadata,
                                    Column('subrating_id',
                                           Integer,
                                           ForeignKey('subratings.id')),
                                    Column('subrating_property_id',
                                           Integer,
                                           ForeignKey('subrating_properties.id')
                                           ))


class SubRatingProperty(Base):
    __tablename__ = 'subrating_properties'
    id = Column(Integer, primary_key=True)
    name = Column(Unicode(32), unique=True)
    subratings = relationship("SubRating",
                              secondary=subrating_subratingproperty,
                              backref="subrating_properties")


class Rating(Base):
    __tablename__ = 'ratings'
    id = Column(Integer, primary_key=True)
    name = Column(Unicode(32), unique=True)
    subrating_id = Column(Integer, ForeignKey('subratings.id'))
    subrating = relationship("SubRating",
                             cascade="all, delete-orphan",
                             backref=backref("rating", uselist=False))


class SubRating(Base):
    __tablename__ = 'subratings'
    id = Column(Integer, primary_key=True)
    name = Column(Unicode(32), unique=True)



if __name__ == '__main__':

    from sqlalchemy import create_engine
    from sqlalchemy.orm import scoped_session
    from sqlalchemy.orm import sessionmaker

    engine = create_engine('sqlite:///', echo=True)
    Base.metadata.create_all(engine)
    session = scoped_session(sessionmaker())
    session.configure(bind=engine)

    subrating = SubRating(name=u'My First Subrating')
    rating = Rating(name=u'My First Rating', subrating=subrating)
    session.add(rating)
    session.flush()

    assert rating.subrating != None
    assert subrating.rating != None

    session.commit()

    assert rating.subrating == subrating
    assert subrating.rating == rating

    rating = session.query(Rating).first()

    session.delete(rating)
    session.flush()
    session.commit()

    assert session.query(Rating).all() == []
    assert session.query(SubRating).all() == []

"""
$ python test.py 
2011-08-06 12:13:02,959 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("subratings")
2011-08-06 12:13:02,959 INFO sqlalchemy.engine.base.Engine ()
2011-08-06 12:13:02,960 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("subrating_properties")
2011-08-06 12:13:02,960 INFO sqlalchemy.engine.base.Engine ()
2011-08-06 12:13:02,960 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("ratings")
2011-08-06 12:13:02,960 INFO sqlalchemy.engine.base.Engine ()
2011-08-06 12:13:02,960 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("subrating_subratingproperty_association")
2011-08-06 12:13:02,960 INFO sqlalchemy.engine.base.Engine ()
2011-08-06 12:13:02,961 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE subratings (
	id INTEGER NOT NULL, 
	name VARCHAR(32), 
	PRIMARY KEY (id), 
	UNIQUE (name)
)


2011-08-06 12:13:02,961 INFO sqlalchemy.engine.base.Engine ()
2011-08-06 12:13:02,961 INFO sqlalchemy.engine.base.Engine COMMIT
2011-08-06 12:13:02,962 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE subrating_properties (
	id INTEGER NOT NULL, 
	name VARCHAR(32), 
	PRIMARY KEY (id), 
	UNIQUE (name)
)


2011-08-06 12:13:02,962 INFO sqlalchemy.engine.base.Engine ()
2011-08-06 12:13:02,962 INFO sqlalchemy.engine.base.Engine COMMIT
2011-08-06 12:13:02,962 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE ratings (
	id INTEGER NOT NULL, 
	name VARCHAR(32), 
	subrating_id INTEGER, 
	PRIMARY KEY (id), 
	UNIQUE (name), 
	FOREIGN KEY(subrating_id) REFERENCES subratings (id)
)


2011-08-06 12:13:02,962 INFO sqlalchemy.engine.base.Engine ()
2011-08-06 12:13:02,963 INFO sqlalchemy.engine.base.Engine COMMIT
2011-08-06 12:13:02,963 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE subrating_subratingproperty_association (
	subrating_id INTEGER, 
	subrating_property_id INTEGER, 
	FOREIGN KEY(subrating_id) REFERENCES subratings (id), 
	FOREIGN KEY(subrating_property_id) REFERENCES subrating_properties (id)
)


2011-08-06 12:13:02,963 INFO sqlalchemy.engine.base.Engine ()
2011-08-06 12:13:02,963 INFO sqlalchemy.engine.base.Engine COMMIT
/home/stefano/colander-alchemy/lib/python2.6/site-packages/SQLAlchemy-0.7.2-py2.6-linux-x86_64.egg/sqlalchemy/orm/properties.py:906: SAWarning: On Rating.subrating, delete-orphan cascade is not supported on a many-to-many or many-to-one relationship when single_parent is not set.   Set single_parent=True on the relationship().
  self._determine_direction()
2011-08-06 12:13:02,970 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2011-08-06 12:13:02,971 INFO sqlalchemy.engine.base.Engine INSERT INTO subratings (name) VALUES (?)
2011-08-06 12:13:02,971 INFO sqlalchemy.engine.base.Engine (u'My First Subrating',)
2011-08-06 12:13:02,972 INFO sqlalchemy.engine.base.Engine INSERT INTO ratings (name, subrating_id) VALUES (?, ?)
2011-08-06 12:13:02,972 INFO sqlalchemy.engine.base.Engine (u'My First Rating', 1)
2011-08-06 12:13:02,973 INFO sqlalchemy.engine.base.Engine COMMIT
2011-08-06 12:13:02,973 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2011-08-06 12:13:02,974 INFO sqlalchemy.engine.base.Engine SELECT ratings.id AS ratings_id, ratings.name AS ratings_name, ratings.subrating_id AS ratings_subrating_id 
FROM ratings 
WHERE ratings.id = ?
2011-08-06 12:13:02,974 INFO sqlalchemy.engine.base.Engine (1,)
2011-08-06 12:13:02,975 INFO sqlalchemy.engine.base.Engine SELECT subratings.id AS subratings_id, subratings.name AS subratings_name 
FROM subratings 
WHERE subratings.id = ?
2011-08-06 12:13:02,975 INFO sqlalchemy.engine.base.Engine (1,)
2011-08-06 12:13:02,976 INFO sqlalchemy.engine.base.Engine SELECT ratings.id AS ratings_id, ratings.name AS ratings_name, ratings.subrating_id AS ratings_subrating_id 
FROM ratings 
WHERE ? = ratings.subrating_id
2011-08-06 12:13:02,976 INFO sqlalchemy.engine.base.Engine (1,)
2011-08-06 12:13:02,983 INFO sqlalchemy.engine.base.Engine SELECT ratings.id AS ratings_id, ratings.name AS ratings_name, ratings.subrating_id AS ratings_subrating_id 
FROM ratings
 LIMIT ? OFFSET ?
2011-08-06 12:13:02,983 INFO sqlalchemy.engine.base.Engine (1, 0)
2011-08-06 12:13:02,986 INFO sqlalchemy.engine.base.Engine SELECT subrating_properties.id AS subrating_properties_id, subrating_properties.name AS subrating_properties_name 
FROM subrating_properties, subrating_subratingproperty_association 
WHERE ? = subrating_subratingproperty_association.subrating_id AND subrating_properties.id = subrating_subratingproperty_association.subrating_property_id
2011-08-06 12:13:02,987 INFO sqlalchemy.engine.base.Engine (1,)
2011-08-06 12:13:02,988 INFO sqlalchemy.engine.base.Engine DELETE FROM ratings WHERE ratings.id = ?
2011-08-06 12:13:02,989 INFO sqlalchemy.engine.base.Engine (1,)
2011-08-06 12:13:02,989 INFO sqlalchemy.engine.base.Engine DELETE FROM subratings WHERE subratings.id = ?
2011-08-06 12:13:02,989 INFO sqlalchemy.engine.base.Engine (1,)
2011-08-06 12:13:02,989 INFO sqlalchemy.engine.base.Engine COMMIT
2011-08-06 12:13:02,990 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2011-08-06 12:13:02,990 INFO sqlalchemy.engine.base.Engine SELECT ratings.id AS ratings_id, ratings.name AS ratings_name, ratings.subrating_id AS ratings_subrating_id 
FROM ratings
2011-08-06 12:13:02,990 INFO sqlalchemy.engine.base.Engine ()
2011-08-06 12:13:02,991 INFO sqlalchemy.engine.base.Engine SELECT subratings.id AS subratings_id, subratings.name AS subratings_name 
FROM subratings
2011-08-06 12:13:02,991 INFO sqlalchemy.engine.base.Engine ()
"""

Reply via email to