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 ()
"""