unneeded load during m2o check history

Issue #2049 resolved
Mike Bayer repo owner created an issue

regression introduced in #2002:

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

engine = create_engine('sqlite:///', echo=True)

Base = declarative_base()

class Parent(Base):
   __tablename__ = 'parents'
   id = Column(Integer, primary_key=True)

class Child(Base):
   __tablename__ = 'children'
   id = Column(Integer, primary_key=True)
   parent_id = Column(Integer, ForeignKey(Parent.id))
   parent = relationship('Parent')

Base.metadata.create_all(engine)

session = Session(engine)

parent = Parent()
child = Child(parent=parent)
session.add(child)
session.commit()

print "--------------------------------"
session.delete(session.query(Child).one())
session.flush()

emits an unneeded SELECT:

2011-02-11 12:36:41,819 INFO sqlalchemy.engine.base.Engine.0x...9db0 BEGIN (implicit)
2011-02-11 12:36:41,819 INFO sqlalchemy.engine.base.Engine.0x...9db0 SELECT children.id AS children_id, children.parent_id AS children_parent_id 
FROM children
2011-02-11 12:36:41,819 INFO sqlalchemy.engine.base.Engine.0x...9db0 ()
2011-02-11 12:36:41,821 INFO sqlalchemy.engine.base.Engine.0x...9db0 SELECT parents.id AS parents_id 
FROM parents 
WHERE parents.id = ?
2011-02-11 12:36:41,821 INFO sqlalchemy.engine.base.Engine.0x...9db0 (1,)
2011-02-11 12:36:41,821 INFO sqlalchemy.engine.base.Engine.0x...9db0 DELETE FROM children WHERE children.id = ?
2011-02-11 12:36:41,821 INFO sqlalchemy.engine.base.Engine.0x...9db0 (1,)

patch for testing is :

diff -r 33eae4a1405b1968ad486bfe3aefee7f7d631128 lib/sqlalchemy/orm/dependency.py
--- a/lib/sqlalchemy/orm/dependency.py  Fri Feb 11 11:24:54 2011 -0500
+++ b/lib/sqlalchemy/orm/dependency.py  Fri Feb 11 12:37:47 2011 -0500
@@ -219,7 +219,9 @@
         pass

     def prop_has_changes(self, uowcommit, states, isdelete):
-        passive = not isdelete or self.passive_deletes
+        passive = not isdelete or \
+                    self.passive_deletes or \
+                    self.direction is MANYTOONE

         for s in states:
             # TODO: add a high speed method

Comments (2)

  1. Log in to comment