summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm/unitofwork.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2012-10-04 13:50:36 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2012-10-04 13:50:36 -0400
commit1c3e3225521647cc843a633e34ed84e1ca4e797a (patch)
treef844e59c46b8df996c77e27f65dd6840ce1e49ed /lib/sqlalchemy/orm/unitofwork.py
parentf3e12698fbf03bc7c11a90f6d78d2b2a5efa70fd (diff)
downloadsqlalchemy-1c3e3225521647cc843a633e34ed84e1ca4e797a.tar.gz
- [feature] The Session will produce warnings
when unsupported methods are used inside the "execute" portion of the flush. These are the familiar methods add(), delete(), etc. as well as collection and related-object manipulations, as called within mapper-level flush events like after_insert(), after_update(), etc. It's been prominently documented for a long time that SQLAlchemy cannot guarantee results when the Session is manipulated within the execution of the flush plan, however users are still doing it, so now there's a warning. Maybe someday the Session will be enhanced to support these operations inside of the flush, but for now, results can't be guaranteed.
Diffstat (limited to 'lib/sqlalchemy/orm/unitofwork.py')
-rw-r--r--lib/sqlalchemy/orm/unitofwork.py15
1 files changed, 15 insertions, 0 deletions
diff --git a/lib/sqlalchemy/orm/unitofwork.py b/lib/sqlalchemy/orm/unitofwork.py
index 5fb7a55e5..1cba58321 100644
--- a/lib/sqlalchemy/orm/unitofwork.py
+++ b/lib/sqlalchemy/orm/unitofwork.py
@@ -34,6 +34,9 @@ def track_cascade_events(descriptor, prop):
sess = sessionlib._state_session(state)
if sess:
+ if sess._warn_on_events:
+ sess._flush_warning("collection append")
+
prop = state.manager.mapper._props[key]
item_state = attributes.instance_state(item)
if prop.cascade.save_update and \
@@ -48,7 +51,15 @@ def track_cascade_events(descriptor, prop):
sess = sessionlib._state_session(state)
if sess:
+
prop = state.manager.mapper._props[key]
+
+ if sess._warn_on_events:
+ sess._flush_warning(
+ "collection remove"
+ if prop.uselist
+ else "related attribute delete")
+
# expunge pending orphans
item_state = attributes.instance_state(item)
if prop.cascade.delete_orphan and \
@@ -64,6 +75,10 @@ def track_cascade_events(descriptor, prop):
sess = sessionlib._state_session(state)
if sess:
+
+ if sess._warn_on_events:
+ sess._flush_warning("related attribute set")
+
prop = state.manager.mapper._props[key]
if newvalue is not None:
newvalue_state = attributes.instance_state(newvalue)