Well, now it does make sense. :) Thanks for the explanation.
2011/5/9 Michael Bayer <mike...@zzzcomputing.com> > > On May 9, 2011, at 7:57 AM, Israel Ben Guilherme Fonseca wrote: > > > I didn't get why issuing selects for the children objects when > passive_deletes=False. Wouldn't be better just issue direct deletes, and > maybe using subselects in the where clause of these deletes (for nested > associations) when approriate? It would solve the overhead problem of the > selecting large collections, and it would mimic the ON DELETE CASCADE that > is expected to exist when using passive_delete=True for databases that don't > support this feature. > > > > Thanks in advance for the explanation, > > ON DELETE CASCADE is provided by all databases that SQLAlchemy supports - > see "referential integrity" in this chart: > > > http://en.wikipedia.org/wiki/Comparison_of_relational_database_management_systems#Fundamental_features > > the only exception being, MySQL MyISAM. SQLite added foreign keys some > releases ago (they are optional but can be enabled). > > Given that ON DELETE CASCADE is already provided by all databases and > should be used when lots of cascading deletes are needed, the ratio of > usefulness to effort, which would be significant in that it involves a > significantly more complex approach within the unit of work internals as > well as a lot of new tests, doesn't place a feature like this in high > priority. > > It would not be possible for this behavior to be used in all cases, it > would only be an optimizing case when its possible. Consider the case > where cycles exist - parent->child->subchild->subsubchild, and suppose some > rows in "child" reference "subsubchild". The UOW detects the potential for > cycles based on the graph of mappings, and when it has access to all the > individual rows (like the database does when ON DELETE CASCADE works) > breaks cycles into individual groups so that rows are deleted in the proper > order. A query like "DELETE FROM subsubchild WHERE parent_id in (SELECT id > from subchild where parent_id in (SELECT id from child where parent_id=x))" > otherwise would fail. > > The current behavior also has the advantage that objects presently in the > Session, but without their collection-based relationships loaded and linking > them together in memory, are appropriately updated state-wise, as their > collection membership is determined before being marked cascaded members as > "deleted" after a flush. While passive_deletes=True turns this off, some > applications with passive_deletes=False may be relying upon this. Changing > the cascade behavior to not be aware of individual rows when cycles don't > exist mean that the state management of individual objects in a session will > change based on mappings. An application someday removes a relationship > that was linking "subsubchild" to "child", and suddenly the Session begins > to not mark "subsubchild" objects as deleted during a cascade, instead > waiting until commit() is called and all attributes are expired. This is > a subtle side effect arising from seemingly unrelated mapping adjustments - > this makes it tougher for us to make this new optimization a default > behavior. Whereas the difference in behavior between > passive_deletes=True|False is much easier to understand and anticipate. > > So there's potential for surprises, new complexity, many more tests needed, > feature is only an optimization, and will probably have to remain optional > in all cases, all of which is redundant versus pretty much every database's > own ability to do so more efficiently and predictably via ON DELETE CASCADE. > And you can even use query.delete() if you really need to delete lots of > things quickly and you don't have CASCADE immediately available. > > This also might be a good addition for the FAQ which is currently being > cleaned up. > > -- > 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. > > -- 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.