]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
merged -r5676:5699 of trunk
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 18 Jan 2009 22:36:27 +0000 (22:36 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 18 Jan 2009 22:36:27 +0000 (22:36 +0000)
61 files changed:
CHANGES
README.trunk [deleted file]
lib/sqlalchemy/__init__.py
lib/sqlalchemy/databases/mssql.py
lib/sqlalchemy/ext/sqlsoup.py
lib/sqlalchemy/orm/properties.py
lib/sqlalchemy/orm/query.py
lib/sqlalchemy/orm/session.py
lib/sqlalchemy/orm/strategies.py
lib/sqlalchemy/orm/util.py
lib/sqlalchemy/sql/compiler.py
lib/sqlalchemy/sql/expression.py
lib/sqlalchemy/types.py
lib/sqlalchemy/util.py
test/base/utils.py
test/dialect/mssql.py
test/dialect/postgres.py
test/ext/associationproxy.py
test/ext/declarative.py
test/ext/orderinglist.py
test/orm/association.py
test/orm/assorted_eager.py
test/orm/bind.py
test/orm/cascade.py
test/orm/collection.py
test/orm/cycles.py
test/orm/dynamic.py
test/orm/eager_relations.py
test/orm/expire.py
test/orm/inheritance/abc_inheritance.py
test/orm/inheritance/abc_polymorphic.py
test/orm/inheritance/basic.py
test/orm/inheritance/concrete.py
test/orm/inheritance/magazine.py
test/orm/inheritance/manytomany.py
test/orm/inheritance/poly_linked_list.py
test/orm/inheritance/polymorph.py
test/orm/inheritance/polymorph2.py
test/orm/inheritance/productspec.py
test/orm/inheritance/query.py
test/orm/inheritance/single.py
test/orm/lazy_relations.py
test/orm/manytomany.py
test/orm/mapper.py
test/orm/merge.py
test/orm/naturalpks.py
test/orm/onetoone.py
test/orm/pickled.py
test/orm/query.py
test/orm/relationships.py
test/orm/scoping.py
test/orm/selectable.py
test/orm/session.py
test/orm/sharding/shard.py
test/orm/transaction.py
test/orm/unitofwork.py
test/profiling/memusage.py
test/profiling/zoomark_orm.py
test/sql/generative.py
test/sql/query.py
test/zblog/tests.py

diff --git a/CHANGES b/CHANGES
index c45dd101b850f01436b6500d1c07a8713044196a..74ae62752f136613cdd8ae6b29cd668d96835745 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -3,11 +3,26 @@
 =======
 CHANGES
 =======
+0.5.2
+======
 
+- sql
+    - Further fixes to the "percent signs and spaces in column/table
+       names" functionality. [ticket:1284]
+       
 0.5.1
 ========
 
 - orm
+    - Removed an internal join cache which could potentially leak 
+      memory when issuing query.join() repeatedly to ad-hoc 
+      selectables.
+
+    - The "clear()", "save()", "update()", "save_or_update()"
+      Session methods have been deprecated, replaced by 
+      "expunge_all()" and "add()".  "expunge_all()" has also
+      been added to ScopedSession.
+      
     - Modernized the "no mapped table" exception and added a more
       explicit __table__/__tablename__ exception to declarative.
 
@@ -24,7 +39,21 @@ CHANGES
 
     - Test coverage added for `relation()` objects specified on
       concrete mappers. [ticket:1237]
-
+    
+    - Query.from_self() as well as query.subquery() both disable 
+      the rendering of eager joins inside the subquery produced.
+      The "disable all eager joins" feature is available publically
+      via a new query.enable_eagerloads() generative. [ticket:1276]
+      
+    - Added a rudimental series of set operations to Query that
+      receive Query objects as arguments, including union(),
+      union_all(), intersect(), except_(), insertsect_all(),
+      except_all().  See the API documentation for
+      Query.union() for examples. 
+
+    - Fixed bug that prevented Query.join() and eagerloads from 
+      attaching to a query that selected from a union or aliased union.
+      
     - A short documentation example added for bidirectional
       relations specified on concrete mappers. [ticket:1237]
 
@@ -46,6 +75,17 @@ CHANGES
       which contained no defined values for the child table where
       an UPDATE with no SET clause would be rendered.
 
+    - Using delete-orphan on a many-to-many relation is deprecated.
+      This produces misleading or erroneous results since SQLA does 
+      not retrieve the full list of "parents" for m2m.  To get delete-orphan
+      behavior with an m2m table, use an explcit association class
+      so that the individual association row is treated as a parent.
+      [ticket:1281]
+    
+    - delete-orphan cascade always requires delete cascade.  Specifying
+      delete-orphan without delete now raises a deprecation warning.
+      [ticket:1281]
+      
 - sql
     - Improved the methodology to handling percent signs in column
       names from [ticket:1256].  Added more tests.  MySQL and
@@ -94,6 +134,9 @@ CHANGES
       properly.
 
 - mssql
+    - Corrected handling of large decimal values with more robust
+      tests. Removed string manipulation on floats. [ticket:1280]
+
     - Modified the do_begin handling in mssql to use the Cursor not
       the Connection so it is DBAPI compatible.
 
diff --git a/README.trunk b/README.trunk
deleted file mode 100644 (file)
index d992f78..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-Trunk of SQLAlchemy is now the pre-0.5 version.  This version removes
-many things which were deprecated in 0.4 and therefore is not
-backwards compatible with all 0.4 appliactions.
-
-A work in progress describing the changes from 0.4 is at:
-
-    http://www.sqlalchemy.org/trac/wiki/05Migration
-
-IMPORTANT: some file names have changed in this branch.  Remove all
-existing *.pyc files before using!
-
-To continue working with the current development revision of version
-0.4, switch this working copy to the 0.4 maintenance branch:
-
-    svn switch http://svn.sqlalchemy.org/sqlalchemy/branches/rel_0_4
index cc425acb23ea5643f56512f8f1ff31c8ed892532..5ef4ff6d841352f134b76b952b65249d62bdfb0f 100644 (file)
@@ -106,6 +106,7 @@ from sqlalchemy.engine import create_engine, engine_from_config
 
 __all__ = sorted(name for name, obj in locals().items()
                  if not (name.startswith('_') or inspect.ismodule(obj)))
-__version__ = '0.5.1'
+                 
+__version__ = '0.5.2'
 
 del inspect, sys
index dda0fddd24703c2097ab9438fc3d5776ab2f94ed..c972b6b0cab6aa6159d3d9f2bcfe27a30d0078f6 100644 (file)
@@ -332,16 +332,17 @@ class MSNumeric(sqltypes.Numeric):
                 # Not sure that this exception is needed
                 return value
             else:
-                # FIXME: this will not correct a situation where a float
-                # gets converted to e-notation.
-                if isinstance(value, decimal.Decimal) and value._exp < -6:
-                    value = ((value < 0 and '-' or '')
-                        + '0.'
-                        + '0' * -(value._exp+1)
-                        + value._int)
-                    return value
+                if isinstance(value, decimal.Decimal):
+                    sign = (value < 0 and '-' or '') 
+                    if value._exp > -1:
+                        return float(sign + value._int + '0' * value._exp)
+                    else:
+                        s = value._int.zfill(-value._exp+1)
+                        pos = len(s) + value._exp
+                        return sign + s[:pos] + '.' + s[pos:]
                 else:
-                    return str(value)
+                    return value
+
         return process
 
     def get_col_spec(self):
@@ -358,14 +359,6 @@ class MSFloat(sqltypes.Float):
         else:
             return "FLOAT(%(precision)s)" % {'precision': self.precision}
 
-    def bind_processor(self, dialect):
-        def process(value):
-            """By converting to string, we can use Decimal types round-trip."""
-            if not value is None:
-                return str(value)
-            return None
-        return process
-
 
 class MSReal(MSFloat):
     """A type for ``real`` numbers."""
@@ -380,14 +373,6 @@ class MSReal(MSFloat):
     def adapt(self, impltype):
         return impltype()
 
-    def bind_processor(self, dialect):
-        def process(value):
-            if value is not None:
-                return float(value)
-            else:
-                return value
-        return process
-
     def get_col_spec(self):
         return "REAL"
 
index fbbf8d6fda2c9c54e9e41ef2cd6b4e10206f05fd..37b9d8fa89cc7693a127926f4320ba4fe0bbff13 100644 (file)
@@ -316,7 +316,7 @@ Boring tests here.  Nothing of real expository value.
     >>> db.loans.count()
     1
     >>> _ = db.loans.insert(book_id=1, user_name='Bhargan Basepair')
-    >>> db.clear()
+    >>> db.expunge_all()
     >>> db.flush()
     >>> db.loans.count()
     1
@@ -516,7 +516,10 @@ class SqlSoup:
         Session.flush()
 
     def clear(self):
-        Session.clear()
+        Session.expunge_all()
+
+    def expunge_all(self):
+        Session.expunge_all()
 
     def map(self, selectable, **kwargs):
         try:
index a4561d443df6300764f107c9cd3b5d31149252c6..c83e03599d08fd3e6eefb4f8b0cd5c52abcfc9b7 100644 (file)
@@ -381,7 +381,6 @@ class RelationProperty(StrategizedProperty):
         self.join_depth = join_depth
         self.local_remote_pairs = _local_remote_pairs
         self.extension = extension
-        self.__join_cache = {}
         self.comparator_factory = comparator_factory or RelationProperty.Comparator
         self.comparator = self.comparator_factory(self, None)
         util.set_creation_order(self)
@@ -910,7 +909,11 @@ class RelationProperty(StrategizedProperty):
                     "- foreign key columns are present in both the parent and "
                     "the child's mapped tables.  Specify 'foreign_keys' "
                     "argument." % (str(self)))
-
+        
+        if self.cascade.delete_orphan and self.direction is MANYTOMANY:
+            util.warn("On %s, delete-orphan cascade is not supported on a "
+                    "many-to-many relation.  This will raise an error in 0.6." % self)
+        
     def _determine_local_remote_pairs(self):
         if not self.local_remote_pairs:
             if self.remote_side:
@@ -1000,12 +1003,6 @@ class RelationProperty(StrategizedProperty):
         return self.mapper.common_parent(self.parent)
 
     def _create_joins(self, source_polymorphic=False, source_selectable=None, dest_polymorphic=False, dest_selectable=None, of_type=None):
-        key = util.WeakCompositeKey(source_polymorphic, source_selectable, dest_polymorphic, dest_selectable, of_type)
-        try:
-            return self.__join_cache[key]
-        except KeyError:
-            pass
-
         if source_selectable is None:
             if source_polymorphic and self.parent.with_polymorphic:
                 source_selectable = self.parent._with_polymorphic_selectable
@@ -1072,10 +1069,9 @@ class RelationProperty(StrategizedProperty):
         else:
             target_adapter = None
 
-        self.__join_cache[key] = ret = (primaryjoin, secondaryjoin, 
+        return (primaryjoin, secondaryjoin, 
                 (source_selectable or self.parent.local_table), 
                 (dest_selectable or self.mapper.local_table), secondary, target_adapter)
-        return ret
 
     def _get_join(self, parent, primary=True, secondary=True, polymorphic_parent=True):
         """deprecated.  use primary_join_against(), secondary_join_against(), full_join_against()"""
index 3e2063f76584945ff18681911dfb92a9f077502a..6690eee128aa710c12df33c3eff836c3f2e40b53 100644 (file)
@@ -73,6 +73,7 @@ class Query(object):
         self._correlate = set()
         self._joinpoint = None
         self._with_labels = False
+        self._enable_eagerloads = True
         self.__joinable_tables = None
         self._having = None
         self._populate_existing = False
@@ -131,16 +132,14 @@ class Query(object):
 
     def __set_select_from(self, from_obj):
         if isinstance(from_obj, expression._SelectBaseMixin):
-            # alias SELECTs and unions
             from_obj = from_obj.alias()
 
         self._from_obj = from_obj
         equivs = self.__all_equivs()
 
         if isinstance(from_obj, expression.Alias):
-            # dont alias a regular join (since its not an alias itself)
             self._from_obj_alias = sql_util.ColumnAdapter(self._from_obj, equivs)
-
+            
     def _get_polymorphic_adapter(self, entity, selectable):
         self.__mapper_loads_polymorphically_with(entity.mapper, sql_util.ColumnAdapter(selectable, entity.mapper._equivalent_columns))
 
@@ -318,13 +317,37 @@ class Query(object):
     @property
     def statement(self):
         """The full SELECT statement represented by this Query."""
+        
         return self._compile_context(labels=self._with_labels).statement._annotate({'_halt_adapt': True})
 
+    @property
+    def _nested_statement(self):
+        return self.with_labels().enable_eagerloads(False).statement.correlate(None)
+
     def subquery(self):
-        """return the full SELECT statement represented by this Query, embedded within an Alias."""
+        """return the full SELECT statement represented by this Query, embedded within an Alias.
+        
+        Eager JOIN generation within the query is disabled.
+        
+        """
 
-        return self.statement.alias()
+        return self.enable_eagerloads(False).statement.alias()
 
+    @_generative()
+    def enable_eagerloads(self, value):
+        """Control whether or not eager joins are rendered.
+        
+        When set to False, the returned Query will not render 
+        eager joins regardless of eagerload() options
+        or mapper-level lazy=False configurations.
+        
+        This is used primarily when nesting the Query's
+        statement into a subquery or other
+        selectable.
+        
+        """
+        self._enable_eagerloads = value
+        
     @_generative()
     def with_labels(self):
         """Apply column labels to the return value of Query.statement.
@@ -524,23 +547,27 @@ class Query(object):
         m = _MapperEntity(self, entity)
         self.__setup_aliasizers([m])
 
-    @_generative()
     def from_self(self, *entities):
         """return a Query that selects from this Query's SELECT statement.
 
         \*entities - optional list of entities which will replace
         those being selected.
+
         """
+        fromclause = self._nested_statement
+        q = self._from_selectable(fromclause)
+        if entities:
+            q._set_entities(entities)
+        return q
+
+    _from_self = from_self
 
-        fromclause = self.with_labels().statement.correlate(None)
+    @_generative()
+    def _from_selectable(self, fromclause):
         self._statement = self._criterion = None
         self._order_by = self._group_by = self._distinct = False
         self._limit = self._offset = None
         self.__set_select_from(fromclause)
-        if entities:
-            self._set_entities(entities)
-
-    _from_self = from_self
 
     def values(self, *columns):
         """Return an iterator yielding result tuples corresponding to the given list of columns"""
@@ -692,6 +719,92 @@ class Query(object):
         else:
             self._having = criterion
 
+    def union(self, *q):
+        """Produce a UNION of this Query against one or more queries.
+
+        e.g.::
+
+            q1 = sess.query(SomeClass).filter(SomeClass.foo=='bar')
+            q2 = sess.query(SomeClass).filter(SomeClass.bar=='foo')
+
+            q3 = q1.union(q2)
+            
+        The method accepts multiple Query objects so as to control
+        the level of nesting.  A series of ``union()`` calls such as::
+        
+            x.union(y).union(z).all()
+            
+        will nest on each ``union()``, and produces::
+        
+            SELECT * FROM (SELECT * FROM (SELECT * FROM X UNION SELECT * FROM y) UNION SELECT * FROM Z)
+            
+        Whereas::
+        
+            x.union(y, z).all()
+            
+        produces::
+
+            SELECT * FROM (SELECT * FROM X UNION SELECT * FROM y UNION SELECT * FROM Z)
+
+        """
+        return self._from_selectable(
+                    expression.union(*([self._nested_statement]+ [x._nested_statement for x in q])))
+
+    def union_all(self, *q):
+        """Produce a UNION ALL of this Query against one or more queries.
+
+        Works the same way as :meth:`~sqlalchemy.orm.query.Query.union`.  See that
+        method for usage examples.
+
+        """
+        return self._from_selectable(
+                    expression.union_all(*([self._nested_statement]+ [x._nested_statement for x in q]))
+                )
+
+    def intersect(self, *q):
+        """Produce an INTERSECT of this Query against one or more queries.
+
+        Works the same way as :meth:`~sqlalchemy.orm.query.Query.union`.  See that
+        method for usage examples.
+
+        """
+        return self._from_selectable(
+                    expression.intersect(*([self._nested_statement]+ [x._nested_statement for x in q]))
+                )
+
+    def intersect_all(self, *q):
+        """Produce an INTERSECT ALL of this Query against one or more queries.
+
+        Works the same way as :meth:`~sqlalchemy.orm.query.Query.union`.  See that
+        method for usage examples.
+
+        """
+        return self._from_selectable(
+                    expression.intersect_all(*([self._nested_statement]+ [x._nested_statement for x in q]))
+                )
+
+    def except_(self, *q):
+        """Produce an EXCEPT of this Query against one or more queries.
+
+        Works the same way as :meth:`~sqlalchemy.orm.query.Query.union`.  See that
+        method for usage examples.
+
+        """
+        return self._from_selectable(
+                    expression.except_(*([self._nested_statement]+ [x._nested_statement for x in q]))
+                )
+
+    def except_all(self, *q):
+        """Produce an EXCEPT ALL of this Query against one or more queries.
+
+        Works the same way as :meth:`~sqlalchemy.orm.query.Query.union`.  See that
+        method for usage examples.
+
+        """
+        return self._from_selectable(
+                    expression.except_all(*([self._nested_statement]+ [x._nested_statement for x in q]))
+                )
+
     @util.accepts_a_list_as_starargs(list_deprecation='pending')
     def join(self, *props, **kwargs):
         """Create a join against this ``Query`` object's criterion
@@ -1929,7 +2042,7 @@ class QueryContext(object):
         self.primary_columns = []
         self.secondary_columns = []
         self.eager_order_by = []
-
+        self.enable_eagerloads = query._enable_eagerloads
         self.eager_joins = {}
         self.froms = []
         self.adapter = None
index 62f2d8f317157da5024273ecd3d38a539cb5fda8..690286e9b9b91bed269dbf59f4d54cd54d044e4f 100644 (file)
@@ -526,7 +526,7 @@ class Session(object):
     public_methods = (
         '__contains__', '__iter__', 'add', 'add_all', 'begin', 'begin_nested',
         'clear', 'close', 'commit', 'connection', 'delete', 'execute', 'expire',
-        'expire_all', 'expunge', 'flush', 'get_bind', 'is_modified', 
+        'expire_all', 'expunge', 'expunge_all', 'flush', 'get_bind', 'is_modified', 
         'merge', 'query', 'refresh', 'rollback', 'save',
         'save_or_update', 'scalar', 'update')
 
@@ -772,17 +772,17 @@ class Session(object):
         not use any connection resources until they are first needed.
 
         """
-        self.clear()
+        self.expunge_all()
         if self.transaction is not None:
             for transaction in self.transaction._iterate_parents():
                 transaction.close()
 
+    @classmethod
     def close_all(cls):
         """Close *all* sessions in memory."""
 
         for sess in _sessions.values():
             sess.close()
-    close_all = classmethod(close_all)
 
     def expunge_all(self):
         """Remove all object instances from this ``Session``.
@@ -797,10 +797,8 @@ class Session(object):
         self.identity_map = self._identity_cls()
         self._new = {}
         self._deleted = {}
-    clear = expunge_all
 
-    # TODO: deprecate
-    #clear = util.deprecated()(expunge_all)
+    clear = util.deprecated("Use session.expunge_all()")(expunge_all)
 
     # TODO: need much more test coverage for bind_mapper() and similar !
     # TODO: + crystalize + document resolution order vis. bind_mapper/bind_table
@@ -1044,7 +1042,7 @@ class Session(object):
         self.identity_map.discard(state)
         self._deleted.pop(state, None)
 
-    @util.pending_deprecation('0.5.x', "Use session.add()")
+    @util.deprecated("Use session.add()")
     def save(self, instance):
         """Add a transient (unsaved) instance to this ``Session``.
 
@@ -1063,7 +1061,7 @@ class Session(object):
         state = _state_for_unsaved_instance(instance, create=True)
         self._save_impl(state)
 
-    @util.pending_deprecation('0.5.x', "Use session.add()")
+    @util.deprecated("Use session.add()")
     def update(self, instance):
         """Bring a detached (saved) instance into this ``Session``.
 
@@ -1106,7 +1104,7 @@ class Session(object):
         self._cascade_save_or_update(state)
 
     save_or_update = (
-        util.pending_deprecation('0.5.x', "Use session.add()")(add))
+        util.deprecated("Use session.add()")(add))
 
     def _cascade_save_or_update(self, state):
         for state, mapper in _cascade_unknown_state_iterator('save-update', state, halt_on=lambda c:c in self):
@@ -1205,7 +1203,7 @@ class Session(object):
             merged = mapper.class_manager.new_instance()
             merged_state = attributes.instance_state(merged)
             new_instance = True
-            self.save(merged)
+            self.add(merged)
 
         _recursive[instance] = merged
 
index 68c46f09ef59098c7a72b38d9b543631cb7eb163..7195310cdf0ab9db0943876d332d91043a0552fa 100644 (file)
@@ -594,7 +594,6 @@ class EagerLoader(AbstractRelationLoader):
     
     def init(self):
         super(EagerLoader, self).init()
-        self.clauses = {}
         self.join_depth = self.parent_property.join_depth
 
     def init_class_attribute(self):
@@ -603,6 +602,9 @@ class EagerLoader(AbstractRelationLoader):
     def setup_query(self, context, entity, path, adapter, column_collection=None, parentmapper=None, **kwargs):
         """Add a left outer join to the statement thats being constructed."""
 
+        if not context.enable_eagerloads:
+            return
+            
         path = path + (self.key,)
 
         # check for user-defined eager alias
@@ -649,7 +651,7 @@ class EagerLoader(AbstractRelationLoader):
         # whether or not the Query will wrap the selectable in a subquery,
         # and then attach eager load joins to that (i.e., in the case of LIMIT/OFFSET etc.)
         should_nest_selectable = context.query._should_nest_selectable
-    
+        
         if entity in context.eager_joins:
             entity_key, default_towrap = entity, entity.selectable
         elif should_nest_selectable or not context.from_clause or not sql_util.search(context.from_clause, entity.selectable):
@@ -666,14 +668,8 @@ class EagerLoader(AbstractRelationLoader):
     
         towrap = context.eager_joins.setdefault(entity_key, default_towrap)
     
-        # create AliasedClauses object to build up the eager query.  this is cached after 1st creation.
-        # this also allows ORMJoin to cache the aliased joins it produces since we pass the same
-        # args each time in the typical case.
-        path_key = util.WeakCompositeKey(*path)
-        try:
-            clauses = self.clauses[path_key]
-        except KeyError:
-            self.clauses[path_key] = clauses = mapperutil.ORMAdapter(mapperutil.AliasedClass(self.mapper), 
+        # create AliasedClauses object to build up the eager query.  
+        clauses = mapperutil.ORMAdapter(mapperutil.AliasedClass(self.mapper), 
                     equivalents=self.mapper._equivalent_columns)
 
         if adapter:
index c44583d33898600775b937930cb55816a3773167..f4ba49ae1ec0443695ef794bd3c3c219ecef2a69 100644 (file)
@@ -31,6 +31,11 @@ class CascadeOptions(object):
         self.merge = "merge" in values or "all" in values
         self.expunge = "expunge" in values or "all" in values
         self.refresh_expire = "refresh-expire" in values or "all" in values
+        
+        if self.delete_orphan and not self.delete:
+            util.warn("The 'delete-orphan' cascade option requires "
+                        "'delete'.  This will raise an error in 0.6.")
+            
         for x in values:
             if x not in all_cascades:
                 raise sa_exc.ArgumentError("Invalid cascade option '%s'" % x)
@@ -378,6 +383,10 @@ class _ORMJoin(expression.Join):
             if isinstance(onclause, basestring):
                 prop = left_mapper.get_property(onclause)
             elif isinstance(onclause, attributes.QueryableAttribute):
+                # TODO: we might want to honor the current adapt_from,
+                # if already set.  we would need to adjust how we calculate
+                # adapt_from though since it is present in too many cases
+                # at the moment (query tests illustrate that).
                 adapt_from = onclause.__clause_element__()
                 prop = onclause.property
             elif isinstance(onclause, MapperProperty):
index d506efcacbefa97628b872acf5e6ff0a8ff33387..6ea74395ecc2b68ab5b444a23dc3b3afdcf750a2 100644 (file)
@@ -429,8 +429,7 @@ class SQLCompiler(engine.Compiled):
         return name % self.anon_map
         
     def _process_anon(self, key):
-        (ident, derived) = key.split(' ')
-
+        (ident, derived) = key.split(' ', 1)
         anonymous_counter = self.anon_map.get(derived, 1)
         self.anon_map[derived] = anonymous_counter + 1
         return derived + "_" + str(anonymous_counter)
@@ -444,7 +443,8 @@ class SQLCompiler(engine.Compiled):
 
     def visit_alias(self, alias, asfrom=False, **kwargs):
         if asfrom:
-            return self.process(alias.original, asfrom=True, **kwargs) + " AS " + self.preparer.format_alias(alias, alias.name % self.anon_map)
+            return self.process(alias.original, asfrom=True, **kwargs) + " AS " + \
+                    self.preparer.format_alias(alias, alias.name % self.anon_map)
         else:
             return self.process(alias.original, **kwargs)
 
index f8c7de8d0ff18208bf7dd902570cb23a40143416..5812c434b2b71a218930d542142109997dad86a2 100644 (file)
@@ -1652,7 +1652,7 @@ class ColumnElement(ClauseElement, _CompareMixin):
         expressions and function calls.
 
         """
-        return _generated_label("%%(%d %s)s" % (id(self), _escape_for_generated(getattr(self, 'name', 'anon'))))
+        return _generated_label("%%(%d %s)s" % (id(self), getattr(self, 'name', 'anon')))
 
 class ColumnCollection(util.OrderedProperties):
     """An ordered dictionary that stores a list of ColumnElement
@@ -1984,7 +1984,7 @@ class _BindParamClause(ColumnElement):
 
         """
         if unique:
-            self.key = _generated_label("%%(%d %s)s" % (id(self), key and _escape_for_generated(key) or 'param'))
+            self.key = _generated_label("%%(%d %s)s" % (id(self), key or 'param'))
         else:
             self.key = key or _generated_label("%%(%d param)s" % id(self))
         self._orig_key = key or 'param'
@@ -2003,13 +2003,13 @@ class _BindParamClause(ColumnElement):
     def _clone(self):
         c = ClauseElement._clone(self)
         if self.unique:
-            c.key = _generated_label("%%(%d %s)s" % (id(c), c._orig_key and _escape_for_generated(c._orig_key) or 'param'))
+            c.key = _generated_label("%%(%d %s)s" % (id(c), c._orig_key or 'param'))
         return c
 
     def _convert_to_unique(self):
         if not self.unique:
             self.unique = True
-            self.key = _generated_label("%%(%d %s)s" % (id(self), self._orig_key and _escape_for_generated(self._orig_key) or 'param'))
+            self.key = _generated_label("%%(%d %s)s" % (id(self), self._orig_key or 'param'))
 
     def bind_processor(self, dialect):
         return self.type.dialect_impl(dialect).bind_processor(dialect)
@@ -2616,7 +2616,7 @@ class Alias(FromClause):
         if alias is None:
             if self.original.named_with_column:
                 alias = getattr(self.original, 'name', None)
-            alias = _generated_label('%%(%d %s)s' % (id(self), alias and _escape_for_generated(alias) or 'anon'))
+            alias = _generated_label('%%(%d %s)s' % (id(self), alias or 'anon'))
         self.name = alias
 
     @property
@@ -2737,7 +2737,7 @@ class _Label(ColumnElement):
     def __init__(self, name, element, type_=None):
         while isinstance(element, _Label):
             element = element.element
-        self.name = self.key = self._label = name or _generated_label("%%(%d %s)s" % (id(self), _escape_for_generated(getattr(element, 'name', 'anon'))))
+        self.name = self.key = self._label = name or _generated_label("%%(%d %s)s" % (id(self), getattr(element, 'name', 'anon')))
         self._element = element
         self._type = type_
         self.quote = element.quote
@@ -3132,6 +3132,12 @@ class CompoundSelect(_SelectBaseMixin, FromClause):
     def self_group(self, against=None):
         return _FromGrouping(self)
 
+    def is_derived_from(self, fromclause):
+        for s in self.selects:
+            if s.is_derived_from(fromclause):
+                return True
+        return False
+
     def _populate_column_collection(self):
         for cols in zip(*[s.c for s in self.selects]):
             proxy = cols[0]._make_proxy(self, name=self.use_labels and cols[0]._label or None)
index ea8a8ceb3a198b884eeeecea5c5730e60dbcae42..5e3946c1f161870b7dbb76e256665812cf0f1bba 100644 (file)
@@ -523,7 +523,6 @@ class Text(String):
     params (and the reverse for result sets.)
 
     """
-    
     __visit_name__ = 'text'
 
 class Unicode(String):
index 8e810ffa6afa4bd48040eb5f2ded9173af21f027..ccb9b9459df52f905994acb57428daa68fc79380 100644 (file)
@@ -1188,38 +1188,6 @@ class _TLocalRegistry(ScopedRegistry):
         except AttributeError:
             pass
 
-class WeakCompositeKey(object):
-    """an weak-referencable, hashable collection which is strongly referenced
-    until any one of its members is garbage collected.
-
-    """
-    keys = set()
-
-    __slots__ = 'args', '__weakref__'
-    
-    def __init__(self, *args):
-        self.args = [self.__ref(arg) for arg in args]
-        WeakCompositeKey.keys.add(self)
-
-    def __ref(self, arg):
-        if isinstance(arg, type):
-            return weakref.ref(arg, self.__remover)
-        else:
-            return lambda: arg
-
-    def __remover(self, wr):
-        WeakCompositeKey.keys.discard(self)
-
-    def __hash__(self):
-        return hash(tuple(self))
-
-    def __cmp__(self, other):
-        return cmp(tuple(self), tuple(other))
-
-    def __iter__(self):
-        return iter(arg() for arg in self.args)
-
-
 class _symbol(object):
     def __init__(self, name):
         """Construct a new named symbol."""
index b3e11f230b394c8551471d91b55fb29e79f9b93f..0b7762b7d6b81eb55c37ed9d642e38a97c802d93 100644 (file)
@@ -4,7 +4,6 @@ from sqlalchemy import util, sql, exc
 from testlib import TestBase
 from testlib.testing import eq_, is_, ne_
 
-
 class OrderedDictTest(TestBase):
     def test_odict(self):
         o = util.OrderedDict()
@@ -943,5 +942,6 @@ class TestClassHierarchy(TestBase):
         eq_(set(util.class_hierarchy(Mixin)), set())
         eq_(set(util.class_hierarchy(A)), set((A, B, object)))
 
+        
 if __name__ == "__main__":
     testenv.main()
index 19936b56e092de693d01607728400b9075f411f2..f0b0bec76f6c77f9d1f60fbcacaf575362a25569 100755 (executable)
@@ -234,7 +234,7 @@ class GenerativeQueryTest(TestBase):
 
         sess = create_session(bind=testing.db)
         for i in range(100):
-            sess.save(Foo(bar=i, range=i%10))
+            sess.add(Foo(bar=i, range=i%10))
         sess.flush()
 
     def tearDownAll(self):
@@ -473,32 +473,51 @@ class TypesTest(TestBase):
     def setUpAll(self):
         global numeric_table, metadata
         metadata = MetaData(testing.db)
+
+    def tearDown(self):
+        metadata.drop_all()
+
+    def test_decimal_notation(self):
+        import decimal
         numeric_table = Table('numeric_table', metadata,
             Column('id', Integer, Sequence('numeric_id_seq', optional=True), primary_key=True),
-            Column('numericcol', Numeric(asdecimal=False))
+            Column('numericcol', Numeric(precision=38, scale=20, asdecimal=True))
         )
         metadata.create_all()
 
-    def tearDownAll(self):
-        metadata.drop_all()
+        try:
+            test_items = [decimal.Decimal(d) for d in '1500000.00000000000000000000',
+                          '-1500000.00000000000000000000', '1500000',
+                          '0.0000000000000000002', '0.2', '-0.0000000000000000002',
+                          '156666.458923543', '-156666.458923543', '1', '-1', '1234',
+                          '2E-12', '4E8', '3E-6', '3E-7', '4.1', '1E-1', '1E-2', '1E-3',
+                          '1E-4', '1E-5', '1E-6', '1E-7', '1E-8']
+            for value in test_items:
+                numeric_table.insert().execute(numericcol=value)
+
+            for value in select([numeric_table.c.numericcol]).execute():
+                self.assertTrue(value[0] in test_items, "%s not in test_items" % value[0])
 
-    def tearDown(self):
-        numeric_table.delete().execute()
+        except Exception, e:
+            raise e
 
-    def test_decimal_e_notation(self):
-        from decimal import Decimal
+    def test_float(self):
+        float_table = Table('float_table', metadata,
+            Column('id', Integer, Sequence('numeric_id_seq', optional=True), primary_key=True),
+            Column('floatcol', Float())
+        )
+        metadata.create_all()
 
         try:
-            numeric_table.insert().execute(numericcol=Decimal('4.1'))
-            numeric_table.insert().execute(numericcol=Decimal('1E-1'))
-            numeric_table.insert().execute(numericcol=Decimal('1E-2'))
-            numeric_table.insert().execute(numericcol=Decimal('1E-3'))
-            numeric_table.insert().execute(numericcol=Decimal('1E-4'))
-            numeric_table.insert().execute(numericcol=Decimal('1E-5'))
-            numeric_table.insert().execute(numericcol=Decimal('1E-6'))
-            numeric_table.insert().execute(numericcol=Decimal('1E-7'))
-            numeric_table.insert().execute(numericcol=Decimal('1E-8'))
-            numeric_table.insert().execute(numericcol=10000)
+            test_items = [float(d) for d in '1500000.00000000000000000000',
+                          '-1500000.00000000000000000000', '1500000',
+                          '0.0000000000000000002', '0.2', '-0.0000000000000000002',
+                          '156666.458923543', '-156666.458923543', '1', '-1', '1234',
+                          '2E-12', '4E8', '3E-6', '3E-7', '4.1', '1E-1', '1E-2', '1E-3',
+                          '1E-4', '1E-5', '1E-6', '1E-7', '1E-8']
+            for value in test_items:
+                float_table.insert().execute(floatcol=value)
+
         except Exception, e:
             raise e
 
index 84b2a167486a4bf6e6aa410be7e413dd34e31c8c..e62ef93eb302fe7f79bd72cf13880a62dbaabdfd 100644 (file)
@@ -788,32 +788,32 @@ class ArrayTest(TestBase, AssertsExecutionResults):
         foo = Foo()
         foo.id = 1
         foo.intarr = [1,2,3]
-        sess.save(foo)
+        sess.add(foo)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         foo = sess.query(Foo).get(1)
         self.assertEquals(foo.intarr, [1,2,3])
 
         foo.intarr.append(4)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         foo = sess.query(Foo).get(1)
         self.assertEquals(foo.intarr, [1,2,3,4])
 
         foo.intarr = []
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         self.assertEquals(foo.intarr, [])
 
         foo.intarr = None
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         self.assertEquals(foo.intarr, None)
 
         # Errors in r4217:
         foo = Foo()
         foo.id = 2
-        sess.save(foo)
+        sess.add(foo)
         sess.flush()
 
 class TimeStampTest(TestBase, AssertsExecutionResults):
index 40d36a67a188b244d7faf9fda60234e424a2f5fa..821ed90721f51d3bc2f612cbbe53a2abb00e6b4f 100644 (file)
@@ -82,10 +82,10 @@ class _CollectionOperations(TestBase):
 
     def roundtrip(self, obj):
         if obj not in self.session:
-            self.session.save(obj)
+            self.session.add(obj)
         self.session.flush()
         id, type_ = obj.id, type(obj)
-        self.session.clear()
+        self.session.expunge_all()
         return self.session.query(type_).get(id)
 
     def _test_sequence_ops(self):
@@ -636,10 +636,10 @@ class ScalarTest(TestBase):
 
         def roundtrip(obj):
             if obj not in session:
-                session.save(obj)
+                session.add(obj)
             session.flush()
             id, type_ = obj.id, type(obj)
-            session.clear()
+            session.expunge_all()
             return session.query(type_).get(id)
 
         p = Parent('p')
@@ -752,10 +752,10 @@ class LazyLoadTest(TestBase):
         self.metadata.drop_all()
 
     def roundtrip(self, obj):
-        self.session.save(obj)
+        self.session.add(obj)
         self.session.flush()
         id, type_ = obj.id, type(obj)
-        self.session.clear()
+        self.session.expunge_all()
         return self.session.query(type_).get(id)
 
     def test_lazy_list(self):
index c305fa1d03af0c6693a7e43b1f020a3796ef7651..f6f1e6cfab3a3fc509e6cc9bfe9e410d3857e163 100644 (file)
@@ -47,7 +47,7 @@ class DeclarativeTest(DeclarativeTestBase):
         sess = create_session()
         sess.add(u1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_(sess.query(User).all(), [User(name='u1', addresses=[
             Address(email='one'),
@@ -131,7 +131,7 @@ class DeclarativeTest(DeclarativeTestBase):
         u1 = User(name='ed', addresses=[Address(email='abc'), Address(email='def'), Address(email='xyz')])
         sess.add(u1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         self.assertEquals(sess.query(User).filter(User.name == 'ed').one(),
             User(name='ed', addresses=[Address(email='xyz'), Address(email='def'), Address(email='abc')])
         )
@@ -193,7 +193,7 @@ class DeclarativeTest(DeclarativeTestBase):
         u1 = User(name='ed', addresses=[Address(email='abc'), Address(email='xyz'), Address(email='def')])
         sess.add(u1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         self.assertEquals(sess.query(User).filter(User.name == 'ed').one(),
             User(name='ed', addresses=[Address(email='abc'), Address(email='def'), Address(email='xyz')])
         )
@@ -282,7 +282,7 @@ class DeclarativeTest(DeclarativeTestBase):
         sess = create_session()
         sess.add(u1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_(sess.query(User).all(), [User(name='u1', addresses=[
             Address(email='one'),
@@ -316,7 +316,7 @@ class DeclarativeTest(DeclarativeTestBase):
         sess = create_session()
         sess.add(u1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         eq_(sess.query(User).options(eagerload(User.addresses)).all(), [User(name='u1', addresses=[
             Address(email='one'),
             Address(email='two'),
@@ -345,7 +345,7 @@ class DeclarativeTest(DeclarativeTestBase):
         sess = create_session()
         sess.add(u1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         u = sess.query(User).filter(User.name == 'u1').one()
         a = u.addresses
             
@@ -376,7 +376,7 @@ class DeclarativeTest(DeclarativeTestBase):
         sess = create_session()
         sess.add(u1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_(sess.query(User).all(), [User(name='u1', addresses=[
             Address(email='one'),
@@ -477,7 +477,7 @@ class DeclarativeTest(DeclarativeTestBase):
         sess = create_session()
         sess.add(u1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_(sess.query(User).all(),
             [User(name='u1', address_count=2, addresses=[
@@ -502,7 +502,7 @@ class DeclarativeTest(DeclarativeTestBase):
         sess = create_session()
         sess.add(u1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_(sess.query(User).all(),
             [User(name='u1', a='a', b='b')])
@@ -533,7 +533,7 @@ class DeclarativeTest(DeclarativeTestBase):
         sess = create_session()
         sess.add(u1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_(sess.query(User).all(),
             [User(name='u1', adr_count=2, addresses=[
@@ -570,7 +570,7 @@ class DeclarativeTest(DeclarativeTestBase):
         sess = create_session()
         sess.add(User(name='u1'))
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         u1 = sess.query(User).filter(User.name == 'u1').one()
         assert 'name' not in u1.__dict__
@@ -673,7 +673,7 @@ class DeclarativeTest(DeclarativeTestBase):
         sess = create_session()
         sess.add(u1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_(sess.query(User).all(), [User(name='u1', addresses=[
             Address(email='one'),
@@ -709,7 +709,7 @@ class DeclarativeTest(DeclarativeTestBase):
         sess = create_session()
         sess.add(u1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_(sess.query(User).all(),
             [User(name='u1', address_count=2, addresses=[
@@ -812,7 +812,7 @@ class DeclarativeInheritanceTest(DeclarativeTestBase):
         sess.add(c1)
         sess.add(c2)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_((sess.query(Company).
              filter(Company.employees.of_type(Engineer).
@@ -827,11 +827,11 @@ class DeclarativeInheritanceTest(DeclarativeTestBase):
         
         # assert that the "id" column is available without a second load.
         # this would be the symptom of the previous step not being correct.
-        sess.clear()
+        sess.expunge_all()
         def go():
             assert sess.query(Manager).filter(Manager.name=='dogbert').one().id
         self.assert_sql_count(testing.db, go, 1)
-        sess.clear()
+        sess.expunge_all()
         def go():
             assert sess.query(Person).filter(Manager.name=='dogbert').one().id
         self.assert_sql_count(testing.db, go, 1)
@@ -902,7 +902,7 @@ class DeclarativeInheritanceTest(DeclarativeTestBase):
         sess.add(c1)
         sess.add(c2)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_((sess.query(Person).
              filter(Engineer.primary_language == 'cobol').first()),
@@ -973,7 +973,7 @@ class DeclarativeInheritanceTest(DeclarativeTestBase):
         sess.add(c1)
         sess.add(c2)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_((sess.query(Person).
              filter(Engineer.primary_language == 'cobol').first()),
@@ -1036,7 +1036,7 @@ class DeclarativeInheritanceTest(DeclarativeTestBase):
         sess.add(c1)
         sess.add(c2)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_((sess.query(Person).with_polymorphic(Engineer).
              filter(Engineer.primary_language == 'cobol').first()),
@@ -1085,7 +1085,7 @@ class DeclarativeInheritanceTest(DeclarativeTestBase):
         e3 =Engineer(name="vlad", primary_language=cobol) 
         sess.add_all([e1, e2, e3])
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_((sess.query(Person).
              filter(Engineer.primary_language.has(Language.name=='cobol')).first()),
@@ -1204,7 +1204,7 @@ class DeclarativeInheritanceTest(DeclarativeTestBase):
         
         sess.add_all([e1, e2, m1, e3])
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         eq_(
             sess.query(Person).order_by(Person.name).all(),
             [
@@ -1338,7 +1338,7 @@ class DeclarativeReflectionTest(testing.TestBase):
         sess = create_session()
         sess.add(u1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_(sess.query(User).all(), [User(name='u1', addresses=[
             Address(email='one'),
@@ -1369,7 +1369,7 @@ class DeclarativeReflectionTest(testing.TestBase):
         sess = create_session()
         sess.add(u1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_(sess.query(User).all(), [User(nom='u1', addresses=[
             Address(email='one'),
@@ -1403,7 +1403,7 @@ class DeclarativeReflectionTest(testing.TestBase):
         sess = create_session()
         sess.add(u1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_(sess.query(User).all(), [User(name='u1', handles=[
             IMHandle(network='blabber', handle='foo'),
@@ -1468,11 +1468,11 @@ class DeclarativeReflectionTest(testing.TestBase):
         eq_(u1.uc_name, 'SOMEUSER', u1.uc_name)
         sess.add(u1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         rt = sess.query(User).filter(User.uc_name == 'SOMEUSER').one()
         eq_(rt, u1)
-        sess.clear()
+        sess.expunge_all()
 
         rt = sess.query(User).filter(User.uc_name.startswith('SOMEUSE')).one()
         eq_(rt, u1)
index 4ff03408f44a53c728c6c303d87f066b3dd6750a..c111a02de6463fbe6ad20ace39e946c151d5de39 100644 (file)
@@ -132,11 +132,11 @@ class OrderingListTest(TestBase):
         self.assert_(s1.bullets[3].position == 4)
 
         session = create_session()
-        session.save(s1)
+        session.add(s1)
         session.flush()
 
         id = s1.id
-        session.clear()
+        session.expunge_all()
         del s1
 
         srt = session.query(Slide).get(id)
@@ -196,11 +196,11 @@ class OrderingListTest(TestBase):
         s1.bullets._reorder()
         self.assert_(s1.bullets[4].position == 5)
         session = create_session()
-        session.save(s1)
+        session.add(s1)
         session.flush()
 
         id = s1.id
-        session.clear()
+        session.expunge_all()
         del s1
 
         srt = session.query(Slide).get(id)
@@ -215,7 +215,7 @@ class OrderingListTest(TestBase):
         srt.bullets._raw_append(Bullet('raw2'))
         srt.bullets[-1].position = 6
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         srt = session.query(Slide).get(id)
         titles = ['s1/b1','s1/b2','s1/b100','s1/b4', 'raw', 'raw2']
@@ -253,11 +253,11 @@ class OrderingListTest(TestBase):
         self.assert_(s1.bullets[5].position == 5)
 
         session = create_session()
-        session.save(s1)
+        session.add(s1)
         session.flush()
 
         id = s1.id
-        session.clear()
+        session.expunge_all()
         del s1
 
         srt = session.query(Slide).get(id)
@@ -296,11 +296,11 @@ class OrderingListTest(TestBase):
             self.assert_(s1.bullets[li] == b[bi])
 
         session = create_session()
-        session.save(s1)
+        session.add(s1)
         session.flush()
 
         id = s1.id
-        session.clear()
+        session.expunge_all()
         del s1
 
         srt = session.query(Slide).get(id)
@@ -323,7 +323,7 @@ class OrderingListTest(TestBase):
         self.assert_(s1.bullets[2].position == 2)
 
         session = create_session()
-        session.save(s1)
+        session.add(s1)
         session.flush()
 
         new_bullet = Bullet('new 2')
@@ -339,7 +339,7 @@ class OrderingListTest(TestBase):
         id = s1.id
 
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         srt = session.query(Slide).get(id)
 
index 59130aac2e4407528d92dc711cfa74ee2e9cd6ab..d9265ffb104b3b09ccc9e0b67ffb43fd9e808b49 100644 (file)
@@ -72,7 +72,7 @@ class AssociationTest(_base.MappedTest):
         sess.add_all((item1, item2))
         sess.flush()
         saved = repr([item1, item2])
-        sess.clear()
+        sess.expunge_all()
         l = sess.query(Item).all()
         loaded = repr(l)
         eq_(saved, loaded)
@@ -91,7 +91,7 @@ class AssociationTest(_base.MappedTest):
         item1.keywords.append(KeywordAssociation(red_keyword, 'new_red_assoc'))
         sess.flush()
         saved = repr([item1])
-        sess.clear()
+        sess.expunge_all()
         l = sess.query(Item).all()
         loaded = repr(l)
         eq_(saved, loaded)
@@ -118,7 +118,7 @@ class AssociationTest(_base.MappedTest):
 
         sess.flush()
         saved = repr([item1, item2])
-        sess.clear()
+        sess.expunge_all()
         l = sess.query(Item).all()
         loaded = repr(l)
         eq_(saved, loaded)
index c6444a333c47feab97fcf309e80be353bfc740b9..8dc95fa5b23e9895640f0ad40d7d05eaf2f759ff 100644 (file)
@@ -260,7 +260,7 @@ class EagerTest2(_base.MappedTest):
         session = create_session()
         session.add(p)
         session.flush()
-        session.clear()
+        session.expunge_all()
         obj = session.query(Left).filter_by(data='l1').one()
 
 
@@ -463,13 +463,13 @@ class EagerTest5(_base.MappedTest):
         d2.comments = [Comment('uid2', 'comment')]
         sess.add_all((d, d2))
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         # this eager load sets up an AliasedClauses for the "comment"
         # relationship, then stores it in clauses_by_lead_mapper[mapper for
         # Derived]
         d = sess.query(Derived).get('uid1')
-        sess.clear()
+        sess.expunge_all()
         assert len([c for c in d.comments]) == 1
 
         # this eager load sets up an AliasedClauses for the "comment"
@@ -477,7 +477,7 @@ class EagerTest5(_base.MappedTest):
         # for DerivedII].  the bug was that the previous AliasedClause create
         # prevented this population from occurring.
         d2 = sess.query(DerivedII).get('uid2')
-        sess.clear()
+        sess.expunge_all()
 
         # object is not in the session; therefore the lazy load cant trigger
         # here, eager load had to succeed
@@ -546,7 +546,7 @@ class EagerTest6(_base.MappedTest):
         sess = create_session()
         sess.add(d)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         x = sess.query(Design).get(1)
         x.inheritedParts
 
@@ -630,10 +630,10 @@ class EagerTest7(_base.MappedTest):
         company_id = c1.company_id
         invoice_id = i1.invoice_id
 
-        session.clear()
+        session.expunge_all()
         c = session.query(Company).get(company_id)
 
-        session.clear()
+        session.expunge_all()
         i = session.query(Invoice).get(invoice_id)
 
         eq_(c, i.company)
@@ -674,7 +674,7 @@ class EagerTest7(_base.MappedTest):
 
         company_id = c1.company_id
 
-        session.clear()
+        session.expunge_all()
 
         a = session.query(Company).get(company_id)
 
@@ -688,10 +688,10 @@ class EagerTest7(_base.MappedTest):
         session.flush()
         invoice_id = i1.invoice_id
 
-        session.clear()
+        session.expunge_all()
         c = session.query(Company).get(company_id)
 
-        session.clear()
+        session.expunge_all()
         i = session.query(Invoice).get(invoice_id)
 
         eq_(c, i.company)
@@ -849,7 +849,7 @@ class EagerTest9(_base.MappedTest):
 
         session.add(acc1)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         def go():
             # load just the first Account.  eager loading will actually load
index 189b864c02d3babbc302043447607a4a316ce9f3..33d028d22ec74777fc09ee7d2f2acc747720c8e4 100644 (file)
@@ -33,7 +33,7 @@ class BindTest(_base.MappedTest):
                 sess = create_session(bind=bind)
                 assert sess.bind is bind
                 f = Foo()
-                sess.save(f)
+                sess.add(f)
                 sess.flush()
                 assert sess.query(Foo).get(f.id) is f
             finally:
index 0a3f800d3ff0b1860f9b40c937b2363c9803e64b..10de5cce741b190ca9ae2b6f9002c61244bbd756 100644 (file)
@@ -31,7 +31,7 @@ class O2MCascadeTest(_fixtures.FixtureTest):
                  Order(description='someotherorder')])
         sess.add(u)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         u = sess.query(User).get(u.id)
         eq_(u, User(name='jack',
@@ -40,7 +40,7 @@ class O2MCascadeTest(_fixtures.FixtureTest):
 
         u.orders=[Order(description="order 3"), Order(description="order 4")]
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         u = sess.query(User).get(u.id)
         eq_(u, User(name='jack',
@@ -82,7 +82,7 @@ class O2MCascadeTest(_fixtures.FixtureTest):
                             Address(email_address="address2")])
         sess.add(u)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         assert addresses.count().scalar() == 2
         assert users.count().scalar() == 1
 
@@ -116,7 +116,7 @@ class O2MCascadeTest(_fixtures.FixtureTest):
         u2 = User(name='newuser', orders=[o])
         sess.add(u2)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         assert users.count().scalar() == 1
         assert orders.count().scalar() == 1
         eq_(sess.query(User).all(),
@@ -231,7 +231,7 @@ class NoSaveCascadeTest(_fixtures.FixtureTest):
         assert u1 not in sess
         assert o1 in sess
         
-        sess.clear()
+        sess.expunge_all()
         
         o1 = Order()
         u1 = User(orders=[o1])
@@ -255,7 +255,7 @@ class NoSaveCascadeTest(_fixtures.FixtureTest):
         assert o1 not in sess
         assert u1 in sess
         
-        sess.clear()
+        sess.expunge_all()
 
         u1 = User()
         o1 = Order()
@@ -280,7 +280,7 @@ class NoSaveCascadeTest(_fixtures.FixtureTest):
         assert i1 in sess
         assert k1 not in sess
         
-        sess.clear()
+        sess.expunge_all()
         
         i1 = Item()
         k1 = Keyword()
@@ -383,12 +383,12 @@ class M2OCascadeTest(_base.MappedTest):
         jack = sess.query(User).filter_by(name="jack").one()
         p = jack.pref
         e = jack.pref.extra[0]
-        sess.clear()
+        sess.expunge_all()
 
         jack.pref = None
-        sess.update(jack)
-        sess.update(p)
-        sess.update(e)
+        sess.add(jack)
+        sess.add(p)
+        sess.add(e)
         assert p in sess
         assert e in sess
         sess.flush()
@@ -626,20 +626,33 @@ class M2OCascadeDeleteOrphanTest(_base.MappedTest):
         eq_(sess.query(T3).all(), [])
 
 class M2MCascadeTest(_base.MappedTest):
+    """delete-orphan cascade is deprecated on many-to-many."""
+    
     def define_tables(self, metadata):
         Table('a', metadata,
             Column('id', Integer, primary_key=True),
-            Column('data', String(30)))
+            Column('data', String(30)),
+            test_needs_fk=True
+            )
         Table('b', metadata,
             Column('id', Integer, primary_key=True),
-            Column('data', String(30)))
+            Column('data', String(30)),
+            test_needs_fk=True
+            
+            )
         Table('atob', metadata,
             Column('aid', Integer, ForeignKey('a.id')),
-            Column('bid', Integer, ForeignKey('b.id')))
+            Column('bid', Integer, ForeignKey('b.id')),
+            test_needs_fk=True
+            
+            )
         Table('c', metadata,
               Column('id', Integer, primary_key=True),
               Column('data', String(30)),
-              Column('bid', Integer, ForeignKey('b.id')))
+              Column('bid', Integer, ForeignKey('b.id')),
+              test_needs_fk=True
+              
+              )
 
     def setup_classes(self):
         class A(_fixtures.Base):
@@ -649,6 +662,7 @@ class M2MCascadeTest(_base.MappedTest):
         class C(_fixtures.Base):
             pass
 
+    @testing.emits_warning(".*not supported on a many-to-many")
     @testing.resolve_artifact_names
     def test_delete_orphan(self):
         mapper(A, a, properties={
@@ -670,6 +684,7 @@ class M2MCascadeTest(_base.MappedTest):
         assert b.count().scalar() == 0
         assert a.count().scalar() == 1
 
+    @testing.emits_warning(".*not supported on a many-to-many")
     @testing.resolve_artifact_names
     def test_delete_orphan_cascades(self):
         mapper(A, a, properties={
@@ -693,6 +708,7 @@ class M2MCascadeTest(_base.MappedTest):
         assert a.count().scalar() == 1
         assert c.count().scalar() == 0
 
+    @testing.emits_warning(".*not supported on a many-to-many")
     @testing.resolve_artifact_names
     def test_cascade_delete(self):
         mapper(A, a, properties={
@@ -711,6 +727,39 @@ class M2MCascadeTest(_base.MappedTest):
         assert b.count().scalar() == 0
         assert a.count().scalar() == 0
 
+    @testing.emits_warning(".*not supported on a many-to-many")
+    @testing.fails_on_everything_except('sqlite')
+    @testing.resolve_artifact_names
+    def test_this_doesnt_work(self):
+        """illustrates why cascade with m2m should not be supported
+            (i.e. many parents...)
+            
+        """
+        mapper(A, a, properties={
+            'bs':relation(B, secondary=atob, cascade="all, delete-orphan")
+        })
+        mapper(B, b)
+
+        sess = create_session()
+        b1 =B(data='b1')
+        a1 = A(data='a1', bs=[b1])
+        a2 = A(data='a2', bs=[b1])
+        sess.add(a1)
+        sess.add(a2)
+        sess.flush()
+
+        sess.delete(a1)
+        
+        # this raises an integrity error on DBs that support FKs
+        sess.flush()
+        
+        # still a row present !
+        assert atob.count().scalar() ==1
+        
+        # but no bs !
+        assert b.count().scalar() == 0
+        assert a.count().scalar() == 1
+
 
 class UnsavedOrphansTest(_base.MappedTest):
     """Pending entities that are orphans"""
@@ -791,7 +840,7 @@ class UnsavedOrphansTest(_base.MappedTest):
         u.addresses.remove(a1)
         assert a1 in s
         s.flush()
-        s.clear()
+        s.expunge_all()
         eq_(s.query(Address).all(), [Address(email_address='ad1')])
 
 
@@ -959,7 +1008,7 @@ class DoubleParentOrphanTest(_base.MappedTest):
         b1 = Business(description='business1', address=Address(street='address2'))
         session.add_all((h1,b1))
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         eq_(session.query(Home).get(h1.id), Home(description='home1', address=Address(street='address1')))
         eq_(session.query(Business).get(b1.id), Business(description='business1', address=Address(street='address2')))
@@ -1017,7 +1066,7 @@ class CollectionAssignmentOrphanTest(_base.MappedTest):
         sess.add(a1)
         sess.flush()
 
-        sess.clear()
+        sess.expunge_all()
 
         eq_(sess.query(A).get(a1.id),
             A(name='a1', bs=[B(name='b1'), B(name='b2'), B(name='b3')]))
@@ -1029,7 +1078,7 @@ class CollectionAssignmentOrphanTest(_base.MappedTest):
         a1.bs[1].foo='b3modified'
         sess.flush()
 
-        sess.clear()
+        sess.expunge_all()
         eq_(sess.query(A).get(a1.id),
             A(name='a1', bs=[B(name='b1'), B(name='b2'), B(name='b3')]))
 
index 2c69f65e796139bec73ab2f4c895f16f55be3a9a..23f643597ac2529dc4a1ba44ea7a01f78a6b546c 100644 (file)
@@ -1373,7 +1373,7 @@ class DictHelpersTest(_base.MappedTest):
         session.add(p)
         session.flush()
         pid = p.id
-        session.clear()
+        session.expunge_all()
 
         p = session.query(Parent).get(pid)
 
@@ -1385,7 +1385,7 @@ class DictHelpersTest(_base.MappedTest):
             Child('foo', 'newvalue'))
 
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         p = session.query(Parent).get(pid)
 
@@ -1394,7 +1394,7 @@ class DictHelpersTest(_base.MappedTest):
 
         self.assert_(len(list(collections.collection_adapter(p.children))) == 2)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         p = session.query(Parent).get(pid)
         self.assert_(len(list(collections.collection_adapter(p.children))) == 2)
@@ -1404,7 +1404,7 @@ class DictHelpersTest(_base.MappedTest):
 
         self.assert_(len(list(collections.collection_adapter(p.children))) == 1)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         p = session.query(Parent).get(pid)
         self.assert_(len(list(collections.collection_adapter(p.children))) == 1)
@@ -1412,7 +1412,7 @@ class DictHelpersTest(_base.MappedTest):
         del p.children['bar']
         self.assert_(len(list(collections.collection_adapter(p.children))) == 0)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         p = session.query(Parent).get(pid)
         self.assert_(len(list(collections.collection_adapter(p.children))) == 0)
@@ -1434,7 +1434,7 @@ class DictHelpersTest(_base.MappedTest):
         session.add(p)
         session.flush()
         pid = p.id
-        session.clear()
+        session.expunge_all()
 
         p = session.query(Parent).get(pid)
 
@@ -1445,7 +1445,7 @@ class DictHelpersTest(_base.MappedTest):
             Child('foo', '1', 'newvalue'))
 
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         p = session.query(Parent).get(pid)
 
@@ -1562,7 +1562,7 @@ class CustomCollectionsTest(_base.MappedTest):
         sess = create_session()
         sess.add(f)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         f = sess.query(Foo).get(f.col1)
         assert len(list(f.bars)) == 2
         f.bars.clear()
@@ -1594,7 +1594,7 @@ class CustomCollectionsTest(_base.MappedTest):
         sess = create_session()
         sess.add(f)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         f = sess.query(Foo).get(f.col1)
         assert len(list(f.bars)) == 2
         f.bars.clear()
@@ -1622,7 +1622,7 @@ class CustomCollectionsTest(_base.MappedTest):
         sess = create_session()
         sess.add(f)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         f = sess.query(Foo).get(f.col1)
         assert len(list(f.bars)) == 2
 
@@ -1632,7 +1632,7 @@ class CustomCollectionsTest(_base.MappedTest):
         col.append_with_event(Bar('b'))
         f.bars['a'] = Bar('a')
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         f = sess.query(Foo).get(f.col1)
         assert len(list(f.bars)) == 2
 
@@ -1807,7 +1807,7 @@ class CustomCollectionsTest(_base.MappedTest):
         sess = create_session()
         sess.add(p1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         p2 = sess.query(Parent).get(p1.col1)
         o = list(p2.children)
index c50633c0155e5091677898db316d6fa9f5b41923..958afadaf32d0943f8a15e4625bf4459511432be 100644 (file)
@@ -80,7 +80,7 @@ class SelfReferentialTest(_base.MappedTest):
         sess = create_session()
         sess.add(c1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         c1 = sess.query(C1).get(c1.c1)
         c2 = C1()
         c2.parent = c1
@@ -141,7 +141,7 @@ class SelfReferentialNoPKTest(_base.MappedTest):
         s = create_session()
         s.add(t1)
         s.flush()
-        s.clear()
+        s.expunge_all()
         t = s.query(TT).filter_by(id=t1.id).one()
         eq_(t.children[0].parent_uuid, t1.uuid)
 
@@ -153,7 +153,7 @@ class SelfReferentialNoPKTest(_base.MappedTest):
         t1.children.append(t2)
         s.add(t1)
         s.flush()
-        s.clear()
+        s.expunge_all()
 
         t = s.query(TT).filter_by(id=t2.id).one()
         eq_(t.uuid, t2.uuid)
@@ -207,7 +207,7 @@ class InheritTestOne(_base.MappedTest):
         c1.child1_data = "qwerty"
         session.add(c1)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         c1 = session.query(Child1).filter_by(child1_data="qwerty").one()
         c2 = Child2()
@@ -831,7 +831,7 @@ class SelfReferentialPostUpdateTest2(_base.MappedTest):
         # to fire off anyway
         session.add(f2)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         f1 = session.query(A).get(f1.id)
         f2 = session.query(A).get(f2.id)
index 010999ac547c1be277a4a52147f228dfec22bad0..e72acac9aa38878fc9606dbd220a6bde0b62e3a2 100644 (file)
@@ -171,7 +171,7 @@ class FlushTest(_fixtures.FixtureTest):
         from sqlalchemy.orm import attributes
         self.assertEquals(attributes.get_history(attributes.instance_state(u1), 'addresses'), ([], [Address(email_address='lala@hoho.com')], []))
         
-        sess.clear()
+        sess.expunge_all()
 
         # test the test fixture a little bit
         assert User(name='jack', addresses=[Address(email_address='wrong')]) != sess.query(User).first()
@@ -231,7 +231,7 @@ class FlushTest(_fixtures.FixtureTest):
         sess.delete(u.addresses[3])
         assert [Address(email_address='a'), Address(email_address='b'), Address(email_address='d')] == list(u.addresses)
 
-        sess.clear()
+        sess.expunge_all()
         u = sess.query(User).get(u.id)
 
         sess.delete(u)
@@ -265,7 +265,7 @@ class FlushTest(_fixtures.FixtureTest):
         sess.delete(u.addresses[3])
         assert [Address(email_address='a'), Address(email_address='b'), Address(email_address='d')] == list(u.addresses)
 
-        sess.clear()
+        sess.expunge_all()
         u = sess.query(User).get(u.id)
 
         sess.delete(u)
@@ -397,7 +397,7 @@ class DontDereferenceTest(_base.MappedTest):
         address.user = user
         session.add(user)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         def query1():
             session = create_session(testing.db)
index 6f4004d8d6aac4b84a7946a7cfb3628ac9f61d8b..2752aae3ec2e66978d4fed939bbf6884b7490938 100644 (file)
@@ -32,7 +32,7 @@ class EagerTest(_fixtures.FixtureTest):
         sess.query(User).all()
         m.add_property("addresses", relation(mapper(Address, addresses)))
         
-        sess.clear()
+        sess.expunge_all()
         def go():
             eq_(
                [User(id=7, addresses=[Address(id=1, email_address='jack@bean.com')])],
@@ -163,7 +163,7 @@ class EagerTest(_fixtures.FixtureTest):
             sess.query(Address).filter(Address.id.in_([1, 4, 5])),
             sess.query(Address).filter(Address.id.in_([1, 4, 5])).limit(3)
         ]:
-            sess.clear()
+            sess.expunge_all()
             eq_(q.all(),
                 [Address(id=1, user=User(id=7)),
                  Address(id=4, user=User(id=8)),
@@ -193,12 +193,12 @@ class EagerTest(_fixtures.FixtureTest):
             sess.query(User).filter(User.id==7),
             sess.query(User).filter(User.id==7).limit(1)
         ]:
-            sess.clear()
+            sess.expunge_all()
             eq_(q.all(),
                 [User(id=7, addresses=[Address(id=1)])]
             )
 
-        sess.clear()
+        sess.expunge_all()
         u = sess.query(User).get(7)
         def go():
             assert u.addresses[0].user_id==7
@@ -215,7 +215,7 @@ class EagerTest(_fixtures.FixtureTest):
             'dingalings':relation(Dingaling, lazy=False)})
         mapper(Dingaling, dingalings, properties={
             'address_id':deferred(dingalings.c.address_id)})
-        sess.clear()
+        sess.expunge_all()
         def go():
             u = sess.query(User).get(8)
             eq_(User(id=8,
@@ -618,7 +618,7 @@ class EagerTest(_fixtures.FixtureTest):
             self.assertEquals(o1.address, None)
         self.assert_sql_count(testing.db, go, 2)
         
-        sess.clear()
+        sess.expunge_all()
         def go():
             o1 = sess.query(Order).filter(Order.id==5).one()
             self.assertEquals(o1.address, None)
@@ -810,7 +810,7 @@ class AddEntityTest(_fixtures.FixtureTest):
             eq_(ret, self._assert_result())
         self.assert_sql_count(testing.db, go, 6)
 
-        sess.clear()
+        sess.expunge_all()
         def go():
             ret = sess.query(User, oalias).options(eagerload('addresses'), eagerload(oalias.items)).join(('orders', oalias)).order_by(User.id, oalias.id).all()
             eq_(ret, self._assert_result())
@@ -890,9 +890,9 @@ class SelfReferentialEagerTest(_base.MappedTest):
         n1.children[1].append(Node(data='n121'))
         n1.children[1].append(Node(data='n122'))
         n1.children[1].append(Node(data='n123'))
-        sess.save(n1)
+        sess.add(n1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         def go():
             d = sess.query(Node).filter_by(data='n1').first()
             assert Node(data='n1', children=[
@@ -924,9 +924,9 @@ class SelfReferentialEagerTest(_base.MappedTest):
         n1.children[1].append(Node(data='n121'))
         n1.children[1].append(Node(data='n122'))
         n1.children[1].append(Node(data='n123'))
-        sess.save(n1)
+        sess.add(n1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         # eager load with join depth 1.  when eager load of 'n1' hits the
         # children of 'n12', no columns are present, eager loader degrades to
@@ -961,9 +961,9 @@ class SelfReferentialEagerTest(_base.MappedTest):
         n1 = Node(data='n1')
         n1.append(Node(data='n11'))
         n1.append(Node(data='n12'))
-        sess.save(n1)
+        sess.add(n1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         def go():
             self.assertEquals( 
@@ -972,13 +972,13 @@ class SelfReferentialEagerTest(_base.MappedTest):
                 )
         self.assert_sql_count(testing.db, go, 4)
 
-        sess.clear()
+        sess.expunge_all()
 
         def go():
             assert Node(data='n1', children=[Node(data='n11'), Node(data='n12')]) == sess.query(Node).options(undefer('data')).order_by(Node.id).first()
         self.assert_sql_count(testing.db, go, 3)
 
-        sess.clear()
+        sess.expunge_all()
 
         def go():
             assert Node(data='n1', children=[Node(data='n11'), Node(data='n12')]) == sess.query(Node).options(undefer('data'), undefer('children.data')).first()
@@ -1002,9 +1002,9 @@ class SelfReferentialEagerTest(_base.MappedTest):
         n1.children[1].append(Node(data='n121'))
         n1.children[1].append(Node(data='n122'))
         n1.children[1].append(Node(data='n123'))
-        sess.save(n1)
+        sess.add(n1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         def go():
             d = sess.query(Node).filter_by(data='n1').options(eagerload('children.children')).first()
             assert Node(data='n1', children=[
@@ -1048,9 +1048,9 @@ class SelfReferentialEagerTest(_base.MappedTest):
         n1.children[1].append(Node(data='n121'))
         n1.children[1].append(Node(data='n122'))
         n1.children[1].append(Node(data='n123'))
-        sess.save(n1)
+        sess.add(n1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         def go():
             d = sess.query(Node).filter_by(data='n1').first()
             assert Node(data='n1', children=[
@@ -1094,9 +1094,9 @@ class SelfReferentialM2MEagerTest(_base.MappedTest):
         w1 = Widget(name=u'w1')
         w2 = Widget(name=u'w2')
         w1.children.append(w2)
-        sess.save(w1)
+        sess.add(w1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         assert [Widget(name='w1', children=[Widget(name='w2')])] == sess.query(Widget).filter(Widget.name==u'w1').all()
 
@@ -1297,10 +1297,10 @@ class SubqueryTest(_base.MappedTest):
             })
 
             session = create_session()
-            session.save(User(name='joe', tags=[Tag(score1=5.0, score2=3.0), Tag(score1=55.0, score2=1.0)]))
-            session.save(User(name='bar', tags=[Tag(score1=5.0, score2=4.0), Tag(score1=50.0, score2=1.0), Tag(score1=15.0, score2=2.0)]))
+            session.add(User(name='joe', tags=[Tag(score1=5.0, score2=3.0), Tag(score1=55.0, score2=1.0)]))
+            session.add(User(name='bar', tags=[Tag(score1=5.0, score2=4.0), Tag(score1=50.0, score2=1.0), Tag(score1=15.0, score2=2.0)]))
             session.flush()
-            session.clear()
+            session.expunge_all()
 
             for user in session.query(User).all():
                 eq_(user.query_score, user.prop_score)
index 7db714506c14d2441a7b22afb703166945947424..b18e1ef25258dd8747b0bfc23d505f592be71c1e 100644 (file)
@@ -54,7 +54,7 @@ class ExpireTest(_fixtures.FixtureTest):
         mapper(User, users)
         s = create_session()
         u = s.query(User).get(7)
-        s.clear()
+        s.expunge_all()
 
         self.assertRaisesMessage(sa.exc.InvalidRequestError, r"is not persistent within this Session", s.expire, u)
 
@@ -162,7 +162,7 @@ class ExpireTest(_fixtures.FixtureTest):
             u.name = 'somenewname'
         self.assert_sql_count(testing.db, go, 0)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         assert sess.query(User).get(7).name == 'somenewname'
 
     @testing.resolve_artifact_names
@@ -585,7 +585,7 @@ class ExpireTest(_fixtures.FixtureTest):
         sa.orm.clear_mappers()
 
         mapper(Order, orders)
-        sess.clear()
+        sess.expunge_all()
 
         # same tests, using deferred at the options level
         o = sess.query(Order).options(sa.orm.defer('description')).get(3)
@@ -780,7 +780,7 @@ class RefreshTest(_fixtures.FixtureTest):
         mapper(User, users)
         s = create_session()
         u = s.query(User).get(7)
-        s.clear()
+        s.expunge_all()
         self.assertRaisesMessage(sa.exc.InvalidRequestError, r"is not persistent within this Session", lambda: s.refresh(u))
 
     @testing.resolve_artifact_names
@@ -844,7 +844,7 @@ class RefreshTest(_fixtures.FixtureTest):
 
         s.add(u)
         s.flush()
-        s.clear()
+        s.expunge_all()
         u = s.query(User).filter(User.name=='Justin').one()
 
         s.expire(u)
index 7b14ca929c9573127f7c5e3799596f5c47000542..6415e991916a263132a8d0f571aaf9c302f2eb14 100644 (file)
@@ -114,21 +114,21 @@ def produce_test(parent, child, direction):
 
             #print "APPENDING", parent.__class__.__name__ , "TO", child.__class__.__name__
 
-            sess.save(parent_obj)
+            sess.add(parent_obj)
             parent_obj.collection.append(child_obj)
             if direction == ONETOMANY:
                 child2 = child_class('child2')
                 parent_obj.collection.append(child2)
-                sess.save(child2)
+                sess.add(child2)
             elif direction == MANYTOONE:
                 parent2 = parent_class('parent2')
                 parent2.collection.append(child_obj)
-                sess.save(parent2)
-            sess.save(somea)
-            sess.save(someb)
-            sess.save(somec)
+                sess.add(parent2)
+            sess.add(somea)
+            sess.add(someb)
+            sess.add(somec)
             sess.flush()
-            sess.clear()
+            sess.expunge_all()
 
             # assert result via direct get() of parent object
             result = sess.query(parent_class).get(parent_obj.id)
@@ -141,7 +141,7 @@ def produce_test(parent, child, direction):
                 assert result2.id == parent2.id
                 assert result2.collection[0].id == child_obj.id
 
-            sess.clear()
+            sess.expunge_all()
 
             # assert result via polymorphic load of parent object
             result = sess.query(A).filter_by(id=parent_obj.id).one()
index 05df5d51ee4858f5ac90b65746dc8a22192c87db..79e3f880d10ef88f7a22eea8ed6d3aae35c6aedd 100644 (file)
@@ -46,9 +46,9 @@ class ABCTest(ORMTest):
 
             sess = create_session()
             for x in (a1, b1, b2, b3, c1, c2, c3):
-                sess.save(x)
+                sess.add(x)
             sess.flush()
-            sess.clear()
+            sess.expunge_all()
 
             #for obj in sess.query(A).all():
             #    print obj
index dd0701da4a73b205300a84d98c0bf5116f15e2f1..0068c5534d6274e4e4633e4457c0499f485f5d45 100644 (file)
@@ -50,14 +50,14 @@ class O2MTest(ORMTest):
         b1 = Blub("blub #1")
         b2 = Blub("blub #2")
         f = Foo("foo #1")
-        sess.save(b1)
-        sess.save(b2)
-        sess.save(f)
+        sess.add(b1)
+        sess.add(b2)
+        sess.add(f)
         b1.parent_foo = f
         b2.parent_foo = f
         sess.flush()
         compare = ','.join([repr(b1), repr(b2), repr(b1.parent_foo), repr(b2.parent_foo)])
-        sess.clear()
+        sess.expunge_all()
         l = sess.query(Blub).all()
         result = ','.join([repr(l[0]), repr(l[1]), repr(l[0].parent_foo), repr(l[1].parent_foo)])
         print compare
@@ -77,10 +77,10 @@ class FalseDiscriminatorTest(ORMTest):
         mapper(Bar, inherits=Foo, polymorphic_identity=0)
         sess = create_session()
         f1 = Bar()
-        sess.save(f1)
+        sess.add(f1)
         sess.flush()
         assert f1.type == 0
-        sess.clear()
+        sess.expunge_all()
         assert isinstance(sess.query(Foo).one(), Bar)
         
 class PolymorphicSynonymTest(ORMTest):
@@ -111,10 +111,10 @@ class PolymorphicSynonymTest(ORMTest):
         sess = create_session()
         at1 = T1(info='at1')
         at2 = T2(info='at2', data='t2 data')
-        sess.save(at1)
-        sess.save(at2)
+        sess.add(at1)
+        sess.add(at2)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         self.assertEquals(sess.query(T2).filter(T2.info=='at2').one(), at2)
         self.assertEquals(at2.info, "THE INFO IS:at2")
         
@@ -177,7 +177,7 @@ class CascadeTest(ORMTest):
         t4_1 = T4(data='t4')
         t3_1.t4s.append(t4_1)
 
-        sess.save(t1_1)
+        sess.add(t1_1)
 
 
         assert t4_1 in sess.new
@@ -230,9 +230,9 @@ class GetTest(ORMTest):
             f = Foo()
             b = Bar()
             bl = Blub()
-            sess.save(f)
-            sess.save(b)
-            sess.save(bl)
+            sess.add(f)
+            sess.add(b)
+            sess.add(bl)
             sess.flush()
 
             if polymorphic:
@@ -357,7 +357,7 @@ class FlushTest(ORMTest):
         admin_mapper = mapper(Admin, admins, inherits=user_mapper)
         sess = create_session()
         adminrole = Role()
-        sess.save(adminrole)
+        sess.add(adminrole)
         sess.flush()
 
         # create an Admin, and append a Role.  the dependency processors
@@ -367,7 +367,7 @@ class FlushTest(ORMTest):
         a = Admin()
         a.roles.append(adminrole)
         a.password = 'admin'
-        sess.save(a)
+        sess.add(a)
         sess.flush()
 
         assert user_roles.count().scalar() == 1
@@ -396,13 +396,13 @@ class FlushTest(ORMTest):
         adminrole = Role('admin')
 
         sess = create_session()
-        sess.save(adminrole)
+        sess.add(adminrole)
         sess.flush()
 
         # create admin user
         a = Admin(email='tim', password='admin')
         a.roles.append(adminrole)
-        sess.save(a)
+        sess.add(a)
         sess.flush()
 
         a.password = 'sadmin'
@@ -446,8 +446,8 @@ class VersioningTest(ORMTest):
 
         b1 = Base(value='b1')
         s1 = Sub(value='sub1', subdata='some subdata')
-        sess.save(b1)
-        sess.save(s1)
+        sess.add(b1)
+        sess.add(s1)
 
         sess.flush()
 
@@ -491,9 +491,9 @@ class VersioningTest(ORMTest):
         b1 = Base(value='b1')
         s1 = Sub(value='sub1', subdata='some subdata')
         s2 = Sub(value='sub2', subdata='some other subdata')
-        sess.save(b1)
-        sess.save(s1)
-        sess.save(s2)
+        sess.add(b1)
+        sess.add(s1)
+        sess.add(s2)
 
         sess.flush()
 
@@ -637,16 +637,16 @@ class SyncCompileTest(ORMTest):
         session = create_session()
 
         a = A(data1='a1')
-        session.save(a)
+        session.add(a)
 
         b = B(data1='b1', data2='b2')
-        session.save(b)
+        session.add(b)
 
         c = C(data1='c1', data2='c2', data3='c3')
-        session.save(c)
+        session.add(c)
 
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         assert len(session.query(A).all()) == 3
         assert len(session.query(B).all()) == 2
@@ -852,7 +852,7 @@ class OverrideColKeyTest(ORMTest):
 
         sess.add_all([s1, b1])
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         
         assert sess.query(Base).get(b1.base_id).subdata == "this is base"
         assert sess.query(Sub).get(s1.base_id).subdata == "this is sub"
@@ -877,7 +877,7 @@ class OverrideColKeyTest(ORMTest):
 
         sess.add_all([s1, b1])
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         assert sess.query(Base).get(b1.base_id).data == "this is base"
         assert sess.query(Sub).get(s1.base_id).data == "this is base"
@@ -914,9 +914,9 @@ class OptimizedLoadTest(ORMTest):
         s1 = Sub()
         s1.data = 's1data'
         s1.sub = 's1sub'
-        sess.save(s1)
+        sess.add(s1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         
         # load s1 via Base.  s1.id won't populate since it's relative to 
         # the "sub" table.  The optimized load kicks in and tries to 
index 225a66da8b44212c93dad9c666296511b7227c27..6cdaed7e6934bcf9200c41217cdb2e6cdf2e0194 100644 (file)
@@ -92,10 +92,10 @@ class ConcreteTest(_base.MappedTest):
             concrete=True, polymorphic_identity='engineer')
 
         session = create_session()
-        session.save(Manager('Tom', 'knows how to manage things'))
-        session.save(Engineer('Kurt', 'knows how to hack'))
+        session.add(Manager('Tom', 'knows how to manage things'))
+        session.add(Engineer('Kurt', 'knows how to hack'))
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         assert set([repr(x) for x in session.query(Employee)]) == set(["Engineer Kurt knows how to hack", "Manager Tom knows how to manage things"])
         assert set([repr(x) for x in session.query(Manager)]) == set(["Manager Tom knows how to manage things"])
@@ -148,7 +148,7 @@ class ConcreteTest(_base.MappedTest):
             self.assertEquals(hacker.nickname, "Badass")
         self.assert_sql_count(testing.db, go, 0)
         
-        session.clear()
+        session.expunge_all()
 
         assert repr(session.query(Employee).filter(Employee.name=='Tom').one()) == "Manager Tom knows how to manage things"
         assert repr(session.query(Manager).filter(Manager.name=='Tom').one()) == "Manager Tom knows how to manage things"
@@ -198,7 +198,7 @@ class ConcreteTest(_base.MappedTest):
             self.assertEquals(hacker.nickname, "Badass")
         self.assert_sql_count(testing.db, go, 0)
 
-        session.clear()
+        session.expunge_all()
 
         # check that we aren't getting a cartesian product in the raw SQL.
         # this requires that Engineer's polymorphic discriminator is not rendered
@@ -300,15 +300,15 @@ class ConcreteTest(_base.MappedTest):
         c = Company()
         c.employees.append(Manager('Tom', 'knows how to manage things'))
         c.employees.append(Engineer('Kurt', 'knows how to hack'))
-        session.save(c)
+        session.add(c)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         def go():
             c2 = session.query(Company).get(c.id)
             assert set([repr(x) for x in c2.employees]) == set(["Engineer Kurt knows how to hack", "Manager Tom knows how to manage things"])
         self.assert_sql_count(testing.db, go, 2)
-        session.clear()
+        session.expunge_all()
         def go():
             c2 = session.query(Company).options(eagerload(Company.employees)).get(c.id)
             assert set([repr(x) for x in c2.employees]) == set(["Engineer Kurt knows how to hack", "Manager Tom knows how to manage things"])
index a0444269d1f285574b995d93ce35b9cf0b86087f..2557e4116b39a9a3d4e376aaf812cc84e9f243a6 100644 (file)
@@ -24,7 +24,7 @@ class Location(BaseObject):
     def _set_name(self, name):
         session = create_session()
         s = session.query(LocationName).filter(LocationName.name==name).first()
-        session.clear()
+        session.expunge_all()
         if s is not None:
             self._name = s
 
@@ -193,14 +193,14 @@ def generate_round_trip_test(use_unions=False, use_joins=False):
         page = ClassifiedPage(magazine=magazine,page_no=1)
         page2 = MagazinePage(magazine=magazine,page_no=2)
         page3 = ClassifiedPage(magazine=magazine,page_no=3)
-        session.save(pub)
+        session.add(pub)
 
         session.flush()
         print [x for x in session]
-        session.clear()
+        session.expunge_all()
 
         session.flush()
-        session.clear()
+        session.expunge_all()
         p = session.query(Publication).filter(Publication.name=="Test").one()
 
         print p.issues[0].locations[0].magazine.pages
index 43d36e9aa71790b1a14ebf5eb91da5fcf6d6d551..081bdb8236002ae90758c0d2b45fb6d8b7ec624c 100644 (file)
@@ -59,7 +59,7 @@ class InheritTest(ORMTest):
         g = Group(name="group1")
         g.users.append(User(name="user1", password="pw", email="foo@bar.com", login_id="lg1"))
         sess = create_session()
-        sess.save(g)
+        sess.add(g)
         sess.flush()
         # TODO: put an assertion
 
@@ -94,9 +94,9 @@ class InheritTest2(ORMTest):
         print class_mapper(Bar).primary_key
         b = Bar('somedata')
         sess = create_session()
-        sess.save(b)
+        sess.add(b)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         # test that "bar.bid" does not need to be referenced in a get
         # (ticket 185)
@@ -117,7 +117,7 @@ class InheritTest2(ORMTest):
 
         sess = create_session()
         b = Bar('barfoo')
-        sess.save(b)
+        sess.add(b)
         sess.flush()
 
         f1 = Foo('subfoo1')
@@ -126,7 +126,7 @@ class InheritTest2(ORMTest):
         b.foos.append(f2)
 
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         l = sess.query(Bar).all()
         print l[0]
@@ -185,12 +185,12 @@ class InheritTest3(ORMTest):
 
         sess = create_session()
         b = Bar('bar #1')
-        sess.save(b)
+        sess.add(b)
         b.foos.append(Foo("foo #1"))
         b.foos.append(Foo("foo #2"))
         sess.flush()
         compare = repr(b) + repr(sorted([repr(o) for o in b.foos]))
-        sess.clear()
+        sess.expunge_all()
         l = sess.query(Bar).all()
         print repr(l[0]) + repr(l[0].foos)
         found = repr(l[0]) + repr(sorted([repr(o) for o in l[0].foos]))
@@ -225,18 +225,18 @@ class InheritTest3(ORMTest):
         b2 = Bar("bar #2")
         bl1 = Blub("blub #1")
         for o in (f1, b1, b2, bl1):
-            sess.save(o)
+            sess.add(o)
         bl1.foos.append(f1)
         bl1.bars.append(b2)
         sess.flush()
         compare = repr(bl1)
         blubid = bl1.id
-        sess.clear()
+        sess.expunge_all()
 
         l = sess.query(Blub).all()
         print l
         self.assert_(repr(l[0]) == compare)
-        sess.clear()
+        sess.expunge_all()
         x = sess.query(Blub).filter_by(id=blubid).one()
         print x
         self.assert_(repr(x) == compare)
index 5e9f016c18c19759a600c092f82057133ad9904d..3fe9f9c8d24e5f38a22637f3c261a040284441b5 100644 (file)
@@ -150,7 +150,7 @@ class PolymorphicCircularTest(ORMTest):
             obj = newobj
 
         # save to DB
-        sess.save(t)
+        sess.add(t)
         sess.flush()
 
         # string version of the saved list
@@ -166,7 +166,7 @@ class PolymorphicCircularTest(ORMTest):
 
 
         # clear and query forwards
-        sess.clear()
+        sess.expunge_all()
         node = sess.query(Table1).filter(Table1.id==t.id).first()
         assertlist = []
         while (node):
@@ -178,7 +178,7 @@ class PolymorphicCircularTest(ORMTest):
         forwards = repr(assertlist)
 
         # clear and query backwards
-        sess.clear()
+        sess.expunge_all()
         node = sess.query(Table1).filter(Table1.id==obj.id).first()
         assertlist = []
         while (node):
index aa241cea85cf374ba0d509a67663f28d6fbf3dd7..aee21fa8dc9d36171f4ce249e2ea99b4e975a9e3 100644 (file)
@@ -80,9 +80,9 @@ class InsertOrderTest(PolymorphTest):
         c.employees.append(Person(status='HHH', name='joesmith'))
         c.employees.append(Engineer(status='CGG', engineer_name='engineer2', primary_language='python', name='wally'))
         c.employees.append(Manager(status='ABA', manager_name='manager2', name='jsmith'))
-        session.save(c)
+        session.add(c)
         session.flush()
-        session.clear()
+        session.expunge_all()
         self.assertEquals(session.query(Company).get(c.company_id), c)
 
 class RelationToSubclassTest(PolymorphTest):
@@ -111,9 +111,9 @@ class RelationToSubclassTest(PolymorphTest):
 
         c = Company(name='company1')
         c.managers.append(Manager(status='AAB', manager_name='manager1', name='pointy haired boss'))
-        sess.save(c)
+        sess.add(c)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         self.assertEquals(sess.query(Company).filter_by(company_id=c.company_id).one(), c)
         assert c.managers[0].company is c
@@ -200,16 +200,16 @@ def generate_round_trip_test(include_base, lazy_relation, redefine_colprop, with
         session = create_session()
         c = Company(name='company1')
         c.employees = employees
-        session.save(c)
+        session.add(c)
 
         session.flush()
-        session.clear()
+        session.expunge_all()
         
         self.assertEquals(session.query(Person).get(dilbert.person_id), dilbert)
-        session.clear()
+        session.expunge_all()
 
         self.assertEquals(session.query(Person).filter(Person.person_id==dilbert.person_id).one(), dilbert)
-        session.clear()
+        session.expunge_all()
 
         def go():
             cc = session.query(Company).get(c.company_id)
@@ -253,12 +253,12 @@ def generate_round_trip_test(include_base, lazy_relation, redefine_colprop, with
         dilbert.engineer_name = 'hes dibert!'
 
         session.flush()
-        session.clear()
+        session.expunge_all()
         
         def go():
             session.query(Person).filter(getattr(Person, person_attribute_name)=='dilbert').first()
         self.assert_sql_count(testing.db, go, 1)
-        session.clear()
+        session.expunge_all()
         dilbert = session.query(Person).filter(getattr(Person, person_attribute_name)=='dilbert').first()
         def go():
             # assert that only primary table is queried for already-present-in-session
@@ -267,13 +267,13 @@ def generate_round_trip_test(include_base, lazy_relation, redefine_colprop, with
 
         # test standalone orphans
         daboss = Boss(status='BBB', manager_name='boss', golf_swing='fore', **{person_attribute_name:'daboss'})
-        session.save(daboss)
+        session.add(daboss)
         self.assertRaises(orm_exc.FlushError, session.flush)
         c = session.query(Company).first()
         daboss.company = c
         manager_list = [e for e in c.employees if isinstance(e, Manager)]
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         self.assertEquals(session.query(Manager).order_by(Manager.person_id).all(), manager_list)
         c = session.query(Company).first()
index 78081d506dbcd8a49b0b27cc5680f1620ba3faa9..c5b9b3fde63531cdea4826e178f4d23c84cc3d5b 100644 (file)
@@ -59,9 +59,9 @@ class RelationTest1(ORMTest):
         p = Person(name='some person')
         m = Manager(name='some manager')
         p.manager = m
-        session.save(p)
+        session.add(p)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         p = session.query(Person).get(p.person_id)
         m = session.query(Manager).get(m.person_id)
@@ -86,9 +86,9 @@ class RelationTest1(ORMTest):
         p = Person(name='some person')
         m = Manager(name='some manager')
         m.employee = p
-        session.save(m)
+        session.add(m)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         p = session.query(Person).get(p.person_id)
         m = session.query(Manager).get(m.person_id)
@@ -178,10 +178,10 @@ class RelationTest2(ORMTest):
         m.colleague = p
         if usedata:
             m.data = Data('ms data')
-        sess.save(m)
+        sess.add(m)
         sess.flush()
 
-        sess.clear()
+        sess.expunge_all()
         p = sess.query(Person).get(p.person_id)
         m = sess.query(Manager).get(m.person_id)
         print p
@@ -268,11 +268,11 @@ def generate_test(jointype="join1", usedata=False):
             p.data = Data('ps data')
             m.data = Data('ms data')
 
-        sess.save(m)
-        sess.save(p)
+        sess.add(m)
+        sess.add(p)
         sess.flush()
 
-        sess.clear()
+        sess.expunge_all()
         p = sess.query(Person).get(p.person_id)
         p2 = sess.query(Person).get(p2.person_id)
         p3 = sess.query(Person).get(p3.person_id)
@@ -357,10 +357,10 @@ class RelationTest4(ORMTest):
 
         # creating 5 managers named from M1 to E5
         for i in range(1,5):
-            session.save(Manager(name="M%d" % i,longer_status="YYYYYYYYY"))
+            session.add(Manager(name="M%d" % i,longer_status="YYYYYYYYY"))
         # creating 5 engineers named from E1 to E5
         for i in range(1,5):
-            session.save(Engineer(name="E%d" % i,status="X"))
+            session.add(Engineer(name="E%d" % i,status="X"))
 
         session.flush()
 
@@ -368,12 +368,12 @@ class RelationTest4(ORMTest):
         manager3 = session.query(Manager).filter(Manager.name=="M3").first()
 
         car1 = Car(employee=engineer4)
-        session.save(car1)
+        session.add(car1)
         car2 = Car(employee=manager3)
-        session.save(car2)
+        session.add(car2)
         session.flush()
 
-        session.clear()
+        session.expunge_all()
     
         def go():
             testcar = session.query(Car).options(eagerload('employee')).get(car1.car_id)
@@ -394,7 +394,7 @@ class RelationTest4(ORMTest):
         assert str(usingGet) == "Engineer E4, status X"
         assert str(usingProperty) == "Engineer E4, status X"
 
-        session.clear()
+        session.expunge_all()
         print "-----------------------------------------------------------------"
         # and now for the lightning round, eager !
 
@@ -403,7 +403,7 @@ class RelationTest4(ORMTest):
             assert str(testcar.employee) == "Engineer E4, status X"
         self.assert_sql_count(testing.db, go, 1)
 
-        session.clear()
+        session.expunge_all()
         s = session.query(Car)
         c = s.join("employee").filter(Person.name=="E4")[0]
         assert c.car_id==car1.car_id
@@ -459,10 +459,10 @@ class RelationTest5(ORMTest):
         car1 = Car()
         car2 = Car()
         car2.manager = Manager()
-        sess.save(car1)
-        sess.save(car2)
+        sess.add(car1)
+        sess.add(car2)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         carlist = sess.query(Car).all()
         assert carlist[0].manager is None
@@ -503,10 +503,10 @@ class RelationTest6(ORMTest):
         m = Manager(name='manager1')
         m2 =Manager(name='manager2')
         m.colleague = m2
-        sess.save(m)
+        sess.add(m)
         sess.flush()
 
-        sess.clear()
+        sess.expunge_all()
         m = sess.query(Manager).get(m.person_id)
         m2 = sess.query(Manager).get(m2.person_id)
         assert m.colleague is m2
@@ -601,10 +601,10 @@ class RelationTest7(ORMTest):
                 car=Car()
             else:
                 car=Offraod_Car()
-            session.save(Manager(name="M%d" % i,category="YYYYYYYYY",car=car))
-            session.save(Engineer(name="E%d" % i,field="X",car=car))
+            session.add(Manager(name="M%d" % i,category="YYYYYYYYY",car=car))
+            session.add(Engineer(name="E%d" % i,field="X",car=car))
             session.flush()
-            session.clear()
+            session.expunge_all()
 
         r = session.query(Person).all()
         for p in r:
@@ -697,8 +697,8 @@ class GenerativeTest(TestBase, AssertsExecutionResults):
         active = Status(name="active")
         dead = Status(name="dead")
 
-        session.save(active)
-        session.save(dead)
+        session.add(active)
+        session.add(dead)
         session.flush()
 
         # TODO: we haven't created assertions for all the data combinations created here
@@ -710,8 +710,8 @@ class GenerativeTest(TestBase, AssertsExecutionResults):
                 st=active
             else:
                 st=dead
-            session.save(Manager(name="M%d" % i,category="YYYYYYYYY",status=st))
-            session.save(Engineer(name="E%d" % i,field="X",status=st))
+            session.add(Manager(name="M%d" % i,category="YYYYYYYYY",status=st))
+            session.add(Engineer(name="E%d" % i,field="X",status=st))
 
         session.flush()
 
@@ -721,8 +721,8 @@ class GenerativeTest(TestBase, AssertsExecutionResults):
         # create 2 cars for E4, one active and one dead
         car1 = Car(employee=engineer4,status=active)
         car2 = Car(employee=engineer4,status=dead)
-        session.save(car1)
-        session.save(car2)
+        session.add(car1)
+        session.add(car2)
         session.flush()
 
         # this particular adapt used to cause a recursion overflow;
@@ -807,9 +807,9 @@ class MultiLevelTest(ORMTest):
         c = Manager().set( name= 'head', machine= 'fast', duties= 'many')
 
         session = create_session()
-        session.save(a)
-        session.save(b)
-        session.save(c)
+        session.add(a)
+        session.add(b)
+        session.add(c)
         session.flush()
         assert set(session.query(Employee).all()) == set([a,b,c])
         assert set(session.query( Engineer).all()) == set([b,c])
@@ -898,10 +898,10 @@ class CustomPKTest(ORMTest):
         ot1 = T1()
         ot2 = T2()
         sess = create_session()
-        sess.save(ot1)
-        sess.save(ot2)
+        sess.add(ot1)
+        sess.add(ot2)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         # query using get(), using only one value.  this requires the select_table mapper
         # has the same single-col primary key.
@@ -935,10 +935,10 @@ class CustomPKTest(ORMTest):
         ot1 = T1()
         ot2 = T2()
         sess = create_session()
-        sess.save(ot1)
-        sess.save(ot2)
+        sess.add(ot1)
+        sess.add(ot2)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         # query using get(), using only one value.  this requires the select_table mapper
         # has the same single-col primary key.
@@ -995,7 +995,7 @@ class InheritingEagerTest(ORMTest):
         session = create_session()
 
         bob = Employee()
-        session.save(bob)
+        session.add(bob)
 
         tag = Tag('crazy')
         bob.tags.append(tag)
@@ -1004,7 +1004,7 @@ class InheritingEagerTest(ORMTest):
         bob.tags.append(tag)
         session.flush()
 
-        session.clear()
+        session.expunge_all()
         # query from Employee with limit, query needs to apply eager limiting subquery
         instance = session.query(Employee).filter_by(id=1).limit(1).first()
         assert len(instance.tags) == 2
@@ -1052,10 +1052,10 @@ class MissingPolymorphicOnTest(ORMTest):
         c = C(cdata='c1', adata='a1', b=B(data='c'))
         d = D(cdata='c2', adata='a2', ddata='d2', b=B(data='d'))
         sess = create_session()
-        sess.save(c)
-        sess.save(d)
+        sess.add(c)
+        sess.add(d)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         self.assertEquals(sess.query(A).all(), [C(cdata='c1', adata='a1'), D(cdata='c2', adata='a2', ddata='d2')])
         
 if __name__ == "__main__":
index ba4828c69b4251bfd16a6c2d809448c91df732eb..63c6a24fe24e7e1efa37728a59d164f015ff730b 100644 (file)
@@ -113,10 +113,10 @@ class InheritTest(ORMTest):
         d1 = Detail(name='d1')
         a1.specification.append(SpecLine(slave=d1))
 
-        session.save(a1)
+        session.add(a1)
         orig = repr(a1)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         a1 = session.query(Product).filter_by(name='a1').one()
         new = repr(a1)
@@ -145,11 +145,11 @@ class InheritTest(ORMTest):
 
         s = SpecLine(slave=Product(name='p1'))
         s2 = SpecLine(slave=Detail(name='d1'))
-        session.save(s)
-        session.save(s2)
+        session.add(s)
+        session.add(s2)
         orig = repr([s, s2])
         session.flush()
-        session.clear()
+        session.expunge_all()
         new = repr(session.query(SpecLine).all())
         print orig
         print new
@@ -197,10 +197,10 @@ class InheritTest(ORMTest):
         a1.specification.append(SpecLine(slave=Detail(name='d1')))
         a1.documents.append(Document('doc1'))
         a1.documents.append(RasterDocument('doc2'))
-        session.save(a1)
+        session.add(a1)
         orig = repr(a1)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         a1 = session.query(Product).filter_by(name='a1').one()
         new = repr(a1)
@@ -235,10 +235,10 @@ class InheritTest(ORMTest):
 
         a1 = Assembly(name='a1')
         a1.documents.append(RasterDocument('doc2'))
-        session.save(a1)
+        session.add(a1)
         orig = repr(a1)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         a1 = session.query(Product).filter_by(name='a1').one()
         new = repr(a1)
@@ -248,7 +248,7 @@ class InheritTest(ORMTest):
 
         del a1.documents[0]
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         a1 = session.query(Product).filter_by(name='a1').one()
         assert len(session.query(Document).all()) == 0
@@ -302,10 +302,10 @@ class InheritTest(ORMTest):
         a1.specification.append(SpecLine(slave=Detail(name='d1')))
         a1.documents.append(Document('doc1'))
         a1.documents.append(RasterDocument('doc2'))
-        session.save(a1)
+        session.add(a1)
         orig = repr(a1)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         a1 = session.query(Product).filter_by(name='a1').one()
         new = repr(a1)
index f362ea0974b7a6bae39e1e486de1f8fb5ea08905..fe948931b6acfb12998906a00bf1e4eedcf45ebe 100644 (file)
@@ -166,10 +166,10 @@ def make_test(select_type):
         
             c2.employees = [e3]
             sess = create_session()
-            sess.save(c1)
-            sess.save(c2)
+            sess.add(c1)
+            sess.add(c2)
             sess.flush()
-            sess.clear()
+            sess.expunge_all()
 
             all_employees = [e1, e2, b1, m1, e3]
             c1_employees = [e1, e2, b1, m1]
@@ -239,13 +239,13 @@ def make_test(select_type):
             sess = create_session()
 
             for aliased in (True, False):
-                sess.clear()
+                sess.expunge_all()
                 self.assertEquals(sess.query(Person).with_polymorphic(Manager).join('paperwork', aliased=aliased).filter(Paperwork.description.like('%review%')).all(), [b1, m1])
 
-                sess.clear()
+                sess.expunge_all()
                 self.assertEquals(sess.query(Person).with_polymorphic([Manager, Engineer]).join('paperwork', aliased=aliased).filter(Paperwork.description.like('%#2%')).all(), [e1, m1])
 
-                sess.clear()
+                sess.expunge_all()
                 self.assertEquals(sess.query(Person).with_polymorphic([Manager, Engineer]).join('paperwork', aliased=aliased).filter(Person.name.like('%dog%')).filter(Paperwork.description.like('%#2%')).all(), [m1])
     
         def test_join_to_polymorphic(self):
@@ -340,22 +340,22 @@ def make_test(select_type):
                 self.assertEquals(sess.query(Person).with_polymorphic(Engineer).filter(Engineer.primary_language=='java').all(), emps_without_relations[0:1])
             self.assert_sql_count(testing.db, go, 1)
             
-            sess.clear()
+            sess.expunge_all()
             def go():
                 self.assertEquals(sess.query(Person).with_polymorphic('*').all(), emps_without_relations)
             self.assert_sql_count(testing.db, go, 1)
 
-            sess.clear()
+            sess.expunge_all()
             def go():
                 self.assertEquals(sess.query(Person).with_polymorphic(Engineer).all(), emps_without_relations)
             self.assert_sql_count(testing.db, go, 3)
 
-            sess.clear()
+            sess.expunge_all()
             def go():
                 self.assertEquals(sess.query(Person).with_polymorphic(Engineer, people.outerjoin(engineers)).all(), emps_without_relations)
             self.assert_sql_count(testing.db, go, 3)
             
-            sess.clear()
+            sess.expunge_all()
             def go():
                 # limit the polymorphic join down to just "Person", overriding select_table
                 self.assertEquals(sess.query(Person).with_polymorphic(Person).all(), emps_without_relations)
@@ -719,10 +719,10 @@ class SelfReferentialTestJoinedToBase(ORMTest):
         p1 = Person(name='dogbert')
         e1 = Engineer(name='dilbert', primary_language='java', reports_to=p1)
         sess = create_session()
-        sess.save(p1)
-        sess.save(e1)
+        sess.add(p1)
+        sess.add(e1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         
         self.assertEquals(sess.query(Engineer).filter(Engineer.reports_to.has(Person.name=='dogbert')).first(), Engineer(name='dilbert'))
 
@@ -739,10 +739,10 @@ class SelfReferentialTestJoinedToBase(ORMTest):
         p1 = Person(name='dogbert')
         e1 = Engineer(name='dilbert', primary_language='java', reports_to=p1)
         sess = create_session()
-        sess.save(p1)
-        sess.save(e1)
+        sess.add(p1)
+        sess.add(e1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         
         self.assertEquals(
             sess.query(Engineer).join('reports_to', aliased=True).filter(Person.name=='dogbert').first(), 
@@ -781,10 +781,10 @@ class SelfReferentialTestJoinedToJoined(ORMTest):
         m1 = Manager(name='dogbert')
         e1 = Engineer(name='dilbert', primary_language='java', reports_to=m1)
         sess = create_session()
-        sess.save(m1)
-        sess.save(e1)
+        sess.add(m1)
+        sess.add(e1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         self.assertEquals(sess.query(Engineer).filter(Engineer.reports_to.has(Manager.name=='dogbert')).first(), Engineer(name='dilbert'))
 
@@ -792,10 +792,10 @@ class SelfReferentialTestJoinedToJoined(ORMTest):
         m1 = Manager(name='dogbert')
         e1 = Engineer(name='dilbert', primary_language='java', reports_to=m1)
         sess = create_session()
-        sess.save(m1)
-        sess.save(e1)
+        sess.add(m1)
+        sess.add(e1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         self.assertEquals(
             sess.query(Engineer).join('reports_to', aliased=True).filter(Manager.name=='dogbert').first(), 
@@ -847,8 +847,8 @@ class M2MFilterTest(ORMTest):
         org2 = Organization(name='org2', engineers=[e3, e4])
         
         sess = create_session()
-        sess.save(org1)
-        sess.save(org2)
+        sess.add(org1)
+        sess.add(org2)
         sess.flush()
         
     def test_not_contains(self):
index 19c9a83f25f9e8c29318179816b2012227cbe441..8134d86c481722236bd8c0256a1bf36ac8666c28 100644 (file)
@@ -227,7 +227,7 @@ class RelationToSingleTest(MappedTest):
         e2 = JuniorEngineer(name='Ed', engineer_info='oh that ed', company=c1)
         sess.add_all([c1, c2, m1, m2, e1, e2])
         sess.commit()
-        sess.clear()
+        sess.expunge_all()
         self.assertEquals(
             sess.query(Company).filter(Company.employees.of_type(JuniorEngineer).any()).all(),
             [
@@ -269,7 +269,7 @@ class RelationToSingleTest(MappedTest):
         self.assertEquals(c1.engineers, [e2])
         self.assertEquals(c2.engineers, [e1])
         
-        sess.clear()
+        sess.expunge_all()
         self.assertEquals(sess.query(Company).order_by(Company.name).all(), 
             [
                 Company(name='c1', engineers=[JuniorEngineer(name='Ed')]),
@@ -278,7 +278,7 @@ class RelationToSingleTest(MappedTest):
         )
 
         # eager load join should limit to only "Engineer"
-        sess.clear()
+        sess.expunge_all()
         self.assertEquals(sess.query(Company).options(eagerload('engineers')).order_by(Company.name).all(), 
             [
                 Company(name='c1', engineers=[JuniorEngineer(name='Ed')]),
@@ -287,7 +287,7 @@ class RelationToSingleTest(MappedTest):
        )
 
         # join() to Company.engineers, Employee as the requested entity
-        sess.clear()
+        sess.expunge_all()
         self.assertEquals(sess.query(Company, Employee).join(Company.engineers).order_by(Company.name).all(),
             [
                 (Company(name='c1'), JuniorEngineer(name='Ed')),
@@ -297,7 +297,7 @@ class RelationToSingleTest(MappedTest):
         
         # join() to Company.engineers, Engineer as the requested entity.
         # this actually applies the IN criterion twice which is less than ideal.
-        sess.clear()
+        sess.expunge_all()
         self.assertEquals(sess.query(Company, Engineer).join(Company.engineers).order_by(Company.name).all(),
             [
                 (Company(name='c1'), JuniorEngineer(name='Ed')),
@@ -306,7 +306,7 @@ class RelationToSingleTest(MappedTest):
         )
 
         # join() to Company.engineers without any Employee/Engineer entity
-        sess.clear()
+        sess.expunge_all()
         self.assertEquals(sess.query(Company).join(Company.engineers).filter(Engineer.name.in_(['Tom', 'Kurt'])).all(),
             [
                 Company(name='c2')
@@ -321,7 +321,7 @@ class RelationToSingleTest(MappedTest):
         # section to "inheritance" laying out all the various behaviors Query has.
         @testing.fails_on_everything_except()
         def go():
-            sess.clear()
+            sess.expunge_all()
             self.assertEquals(sess.query(Company).\
                 filter(Company.company_id==Engineer.company_id).filter(Engineer.name.in_(['Tom', 'Kurt'])).all(),
                 [
@@ -359,29 +359,29 @@ class SingleOnJoinedTest(ORMTest):
         mapper(Manager, inherits=Employee,polymorphic_identity='manager')
         
         sess = create_session()
-        sess.save(Person(name='p1'))
-        sess.save(Employee(name='e1', employee_data='ed1'))
-        sess.save(Manager(name='m1', employee_data='ed2', manager_data='md1'))
+        sess.add(Person(name='p1'))
+        sess.add(Employee(name='e1', employee_data='ed1'))
+        sess.add(Manager(name='m1', employee_data='ed2', manager_data='md1'))
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         
         self.assertEquals(sess.query(Person).order_by(Person.person_id).all(), [
             Person(name='p1'),
             Employee(name='e1', employee_data='ed1'),
             Manager(name='m1', employee_data='ed2', manager_data='md1')
         ])
-        sess.clear()
+        sess.expunge_all()
 
         self.assertEquals(sess.query(Employee).order_by(Person.person_id).all(), [
             Employee(name='e1', employee_data='ed1'),
             Manager(name='m1', employee_data='ed2', manager_data='md1')
         ])
-        sess.clear()
+        sess.expunge_all()
 
         self.assertEquals(sess.query(Manager).order_by(Person.person_id).all(), [
             Manager(name='m1', employee_data='ed2', manager_data='md1')
         ])
-        sess.clear()
+        sess.expunge_all()
         
         def go():
             self.assertEquals(sess.query(Person).with_polymorphic('*').order_by(Person.person_id).all(), [
index 05f752bf6de5aa45eee84d749c717a50040872e0..4ac8a13efcf324473a870c4cdd5624e351380ce3 100644 (file)
@@ -329,7 +329,7 @@ class M2OGetTest(_fixtures.FixtureTest):
         ad1 = Address(email_address='somenewaddress', id=12)
         sess.add(ad1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         ad2 = sess.query(Address).get(1)
         ad3 = sess.query(Address).get(ad1.id)
index 61409c7169a2871c5c948a74c2fb8ee6ddb82bdd..23af3bd1f8bab9f0bdf2827f5491ada81696137a 100644 (file)
@@ -105,7 +105,7 @@ class M2MTest(_base.MappedTest):
         p3.places.append(p4)
         sess.flush()
 
-        sess.clear()
+        sess.expunge_all()
         l = sess.query(Place).order_by(place.c.place_id).all()
         (p1, p2, p3, p4, p5, p6, p7) = l
         assert p1.places == [p2,p3,p5]
@@ -146,7 +146,7 @@ class M2MTest(_base.MappedTest):
         sess.add(tran)
         sess.flush()
 
-        sess.clear()
+        sess.expunge_all()
         r = sess.query(Transition).all()
         self.assert_unordered_result(r, Transition,
             {'name': 'transition1',
@@ -227,7 +227,7 @@ class M2MTest2(_base.MappedTest):
         self.assert_(len(c1.students) == 1)
         sess.add(s1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         s = sess.query(Student).filter_by(name='Student1').one()
         c = sess.query(Course).filter_by(name='Course3').one()
         self.assert_(len(s.courses) == 3)
index eaceb9230fbbeff911718d55a1448bb14ddcf4dc..72e417d26a41966063f3a821961529c6e5fa1571 100644 (file)
@@ -282,7 +282,7 @@ class MapperTest(_fixtures.FixtureTest):
         u.name = 'ed'
         u3 = User()
         u3.name = 'some user'
-        sess.save(u3)
+        sess.add(u3)
         sess.flush()
         sess.rollback()
 
@@ -304,7 +304,7 @@ class MapperTest(_fixtures.FixtureTest):
         m = mapper(User, users)
         m.add_property('name', synonym('_name', map_column=True))
 
-        sess.clear()
+        sess.expunge_all()
         u = sess.query(User).filter_by(name='jack').one()
         eq_(u._name, 'jack')
         eq_(u.name, 'jack')
@@ -805,7 +805,7 @@ class MapperTest(_fixtures.FixtureTest):
             eq_(u.uc_name, "SOME USER NAME")
 
             sess.flush()
-            sess.clear()
+            sess.expunge_all()
 
             q = sess.query(User)
             u2 = q.filter(User.name=='some user name').one()
@@ -992,7 +992,7 @@ class OptionsTest(_fixtures.FixtureTest):
             eq_(len(u.addresses), 3)
         self.sql_count_(0, go)
 
-        sess.clear()
+        sess.expunge_all()
 
         u = sess.query(User).filter_by(id=8).one()
         eq_(u.id, 8)
@@ -1027,7 +1027,7 @@ class OptionsTest(_fixtures.FixtureTest):
             eq_(l, self.static.user_address_result)
         self.sql_count_(1, go)
 
-        sess.clear()
+        sess.expunge_all()
 
         # then select just from users.  run it into instances.
         # then assert the data, which will launch 3 more lazy loads
@@ -1073,7 +1073,7 @@ class OptionsTest(_fixtures.FixtureTest):
             eq_(l, self.static.user_all_result)
         self.assert_sql_count(testing.db, go, 1)
 
-        sess.clear()
+        sess.expunge_all()
 
         # then select just from users.  run it into instances.
         # then assert the data, which will launch 6 more lazy loads
@@ -1189,7 +1189,7 @@ class ValidatorTest(_fixtures.FixtureTest):
         eq_(u1.name, 'ed modified')
         sess.add(u1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         eq_(sess.query(User).filter_by(name='ed modified').one(), User(name='ed'))
         
 
@@ -1209,7 +1209,7 @@ class ValidatorTest(_fixtures.FixtureTest):
         u1.addresses.append(Address(id=15, email_address='foo@bar.com'))
         sess.add(u1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         eq_(
             sess.query(User).filter_by(name='edward').one(), 
             User(name='edward', addresses=[Address(email_address='foo@bar.com')])
@@ -1329,7 +1329,7 @@ class DeferredTest(_fixtures.FixtureTest):
 
         sess = create_session()
         o = Order()
-        sess.save(o)
+        sess.add(o)
         o.id = 7
         def go():
             o.description = "some description"
@@ -1368,7 +1368,7 @@ class DeferredTest(_fixtures.FixtureTest):
 
         sess = create_session()
         o = Order()
-        sess.save(o)
+        sess.add(o)
         o.id = 7
         def go():
             o.description = "some description"
@@ -1382,7 +1382,7 @@ class DeferredTest(_fixtures.FixtureTest):
 
         sess = create_session()
         o = Order()
-        sess.save(o)
+        sess.add(o)
         def go():
             o.description = "some description"
         self.sql_count_(0, go)
@@ -1497,7 +1497,7 @@ class DeferredTest(_fixtures.FixtureTest):
             ("SELECT orders.user_id AS orders_user_id "
              "FROM orders WHERE orders.id = :param_1",
              {'param_1':1})])
-        sess.clear()
+        sess.expunge_all()
 
         q2 = q.options(sa.orm.undefer('user_id'))
         self.sql_eq_(q2.all, [
@@ -1573,7 +1573,7 @@ class DeferredTest(_fixtures.FixtureTest):
         self.sql_count_(1, go)
         eq_(item.description, 'item 4')
 
-        sess.clear()
+        sess.expunge_all()
         l = q.options(sa.orm.undefer('orders.items.description')).all()
         item = l[0].orders[1].items[1]
         def go():
@@ -1623,7 +1623,7 @@ class DeferredPopulationTest(_base.MappedTest):
     def test_query_twice_with_clear(self):
         session = create_session()
         result = session.query(Thing).first()
-        session.clear()
+        session.expunge_all()
         thing = session.query(Thing).options(sa.orm.undefer("name")).first()
         self._test(thing)
 
@@ -1638,7 +1638,7 @@ class DeferredPopulationTest(_base.MappedTest):
     def test_eagerload_with_clear(self):
         session = create_session()
         human = session.query(Human).options(sa.orm.eagerload("thing")).first()
-        session.clear()
+        session.expunge_all()
         thing = session.query(Thing).options(sa.orm.undefer("name")).first()
         self._test(thing)
 
@@ -1653,7 +1653,7 @@ class DeferredPopulationTest(_base.MappedTest):
     def test_join_with_clear(self):
         session = create_session()
         result = session.query(Human).add_entity(Thing).join("thing").first()
-        session.clear()
+        session.expunge_all()
         thing = session.query(Thing).options(sa.orm.undefer("name")).first()
         self._test(thing)
 
@@ -1729,10 +1729,10 @@ class CompositeTypesTest(_base.MappedTest):
         g.version_id=1
         g.edges.append(Edge(Point(3, 4), Point(5, 6)))
         g.edges.append(Edge(Point(14, 5), Point(2, 7)))
-        sess.save(g)
+        sess.add(g)
         sess.flush()
 
-        sess.clear()
+        sess.expunge_all()
         g2 = sess.query(Graph).get([g.id, g.version_id])
         for e1, e2 in zip(g.edges, g2.edges):
             eq_(e1.start, e2.start)
@@ -1740,19 +1740,19 @@ class CompositeTypesTest(_base.MappedTest):
 
         g2.edges[1].end = Point(18, 4)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         e = sess.query(Edge).get(g2.edges[1].id)
         eq_(e.end, Point(18, 4))
 
         e.end.x = 19
         e.end.y = 5
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         eq_(sess.query(Edge).get(g2.edges[1].id).end, Point(19, 5))
 
         g.edges[1].end = Point(19, 5)
 
-        sess.clear()
+        sess.expunge_all()
         def go():
             g2 = (sess.query(Graph).
                   options(sa.orm.eagerload('edges'))).get([g.id, g.version_id])
@@ -1798,13 +1798,13 @@ class CompositeTypesTest(_base.MappedTest):
 
         sess = create_session()
         g = Graph(Version(1, 1))
-        sess.save(g)
+        sess.add(g)
         sess.flush()
 
-        sess.clear()
+        sess.expunge_all()
         g2 = sess.query(Graph).get([1, 1])
         eq_(g.version, g2.version)
-        sess.clear()
+        sess.expunge_all()
 
         g2 = sess.query(Graph).get(Version(1, 1))
         eq_(g.version, g2.version)
@@ -1825,9 +1825,9 @@ class CompositeTypesTest(_base.MappedTest):
         @testing.fails_on_everything_except("sqlite")
         def go():
             g = Graph(Version(2, None))
-            sess.save(g)
+            sess.add(g)
             sess.flush()
-            sess.clear()
+            sess.expunge_all()
             g2 = sess.query(Graph).filter_by(version=Version(2, None)).one()
             eq_(g.version, g2.version)
         go()
@@ -1858,7 +1858,7 @@ class CompositeTypesTest(_base.MappedTest):
         sess = create_session()
         f1 = Foobar()
         f1.foob = FBComposite(None, 5, None, None)
-        sess.save(f1)
+        sess.add(f1)
         sess.flush()
 
         assert f1.foob == FBComposite(2, 5, 15, None)
@@ -1894,7 +1894,7 @@ class CompositeTypesTest(_base.MappedTest):
         sess = create_session()
         f1 = Foobar()
         f1.foob = FBComposite(None, 5, None, None)
-        sess.save(f1)
+        sess.add(f1)
         sess.flush()
         
         assert f1.foob == FBComposite(2, 5, 15, None)
@@ -1941,10 +1941,10 @@ class CompositeTypesTest(_base.MappedTest):
         e = Edge(None, None)
         g.edges.append(e)
         
-        sess.save(g)
+        sess.add(g)
         sess.flush()
         
-        sess.clear()
+        sess.expunge_all()
         
         g2 = sess.query(Graph).get([1, 1])
         assert g2.edges[-1].start.x is None
@@ -2064,10 +2064,10 @@ class MapperExtensionTest(_fixtures.FixtureTest):
         mapper(User, users, extension=Ext())
         sess = create_session()
         u = User(name='u1')
-        sess.save(u)
+        sess.add(u)
         sess.flush()
         u = sess.query(User).populate_existing().get(u.id)
-        sess.clear()
+        sess.expunge_all()
         u = sess.query(User).get(u.id)
         u.name = 'u1 changed'
         sess.flush()
@@ -2092,10 +2092,10 @@ class MapperExtensionTest(_fixtures.FixtureTest):
 
         sess = create_session()
         am = AdminUser(name='au1', email_address='au1@e1')
-        sess.save(am)
+        sess.add(am)
         sess.flush()
         am = sess.query(AdminUser).populate_existing().get(am.id)
-        sess.clear()
+        sess.expunge_all()
         am = sess.query(AdminUser).get(am.id)
         am.name = 'au1 changed'
         sess.flush()
@@ -2122,8 +2122,8 @@ class MapperExtensionTest(_fixtures.FixtureTest):
         sess = create_session()
         i1 = Item(description="i1")
         k1 = Keyword(name="k1")
-        sess.save(i1)
-        sess.save(k1)
+        sess.add(i1)
+        sess.add(k1)
         sess.flush()
         eq_(methods,
             ['instrument_class', 'instrument_class', 'init_instance',
@@ -2150,10 +2150,10 @@ class MapperExtensionTest(_fixtures.FixtureTest):
 
         sess = create_session()
         am = AdminUser(name="au1", email_address="au1@e1")
-        sess.save(am)
+        sess.add(am)
         sess.flush()
         am = sess.query(AdminUser).populate_existing().get(am.id)
-        sess.clear()
+        sess.expunge_all()
         am = sess.query(AdminUser).get(am.id)
         am.name = 'au1 changed'
         sess.flush()
@@ -2179,7 +2179,7 @@ class MapperExtensionTest(_fixtures.FixtureTest):
         u1.name = 'ed'
         sess.add(u1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         assert sess.query(User).first()
         
 
@@ -2280,7 +2280,7 @@ class RequirementsTest(_base.MappedTest):
         s = create_session()
         for i in range(3):
             h1 = H1()
-            s.save(h1)
+            s.add(h1)
 
         h1.h2s.append(H2())
         h1.h3s.extend([H3(), H3()])
@@ -2360,9 +2360,9 @@ class MagicNamesTest(_base.MappedTest):
         m = Map(state='AK', mapper=c)
 
         sess = create_session()
-        sess.save(c)
+        sess.add(c)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
     
         for C, M in ((Cartographer, Map),
                      (sa.orm.aliased(Cartographer), sa.orm.aliased(Map))):
index ba3be1ca6d8c24826ee2058f813c715389953920..ab56dd9783811f7caf5793b7ecca59985b77b005 100644 (file)
@@ -35,7 +35,7 @@ class MergeTest(_fixtures.FixtureTest):
         assert u2 in sess
         eq_(u2, User(id=7, name='fred'))
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         eq_(sess.query(User).first(), User(id=7, name='fred'))
 
     @testing.resolve_artifact_names
@@ -62,7 +62,7 @@ class MergeTest(_fixtures.FixtureTest):
         assert merged_users[0] is not u
 
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_(sess.query(User).one(),
             User(id=7, name='fred', addresses=OrderedSet([
@@ -80,7 +80,7 @@ class MergeTest(_fixtures.FixtureTest):
         u = User(id=7, name='fred')
         sess.add(u)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_(on_load.called, 0)
 
@@ -90,7 +90,7 @@ class MergeTest(_fixtures.FixtureTest):
         assert u2 is not _u2
         eq_(on_load.called, 1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         eq_(sess.query(User).first(), User(id=7, name='fred jones'))
         eq_(on_load.called, 2)
 
@@ -114,7 +114,7 @@ class MergeTest(_fixtures.FixtureTest):
         sess = create_session()
         sess.add(u)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_(on_load.called, 0)
 
@@ -138,7 +138,7 @@ class MergeTest(_fixtures.FixtureTest):
             ]))
         )
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         eq_(sess.query(User).one(),
             User(id=7, name='fred', addresses=OrderedSet([
                 Address(id=3, email_address='fred3'),
@@ -164,7 +164,7 @@ class MergeTest(_fixtures.FixtureTest):
         sess = create_session()
         sess.add(u)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         u.name='fred jones'
         u.addresses.add(Address(id=3, email_address='fred3'))
@@ -174,7 +174,7 @@ class MergeTest(_fixtures.FixtureTest):
         u = sess.merge(u)
         eq_(on_load.called, 4)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_(sess.query(User).first(),
             User(id=7, name='fred jones', addresses=OrderedSet([
@@ -212,7 +212,7 @@ class MergeTest(_fixtures.FixtureTest):
               Address(email_address='hoho@bar.com')]))
 
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         u2 = sess.query(User).get(7)
 
         eq_(u2, User(id=7, name='fred', addresses=[
@@ -267,7 +267,7 @@ class MergeTest(_fixtures.FixtureTest):
         sess3.flush()
 
         # assert modified/merged data was saved
-        sess.clear()
+        sess.expunge_all()
         u = sess.query(User).get(7)
         eq_(u, User(id=7, name='fred2', addresses=[
             Address(email_address='foo@bar.com'),
@@ -605,7 +605,7 @@ class MergeTest(_fixtures.FixtureTest):
         assert not sa.orm.object_mapper(a2)._is_orphan(
             sa.orm.attributes.instance_state(a2))
         sess2.flush()
-        sess2.clear()
+        sess2.expunge_all()
 
         eq_(sess2.query(User).get(u2.id).addresses[0].email_address,
             'somenewaddress')
@@ -631,7 +631,7 @@ class MergeTest(_fixtures.FixtureTest):
             assert not sa.orm.object_mapper(a2)._is_orphan(
                 sa.orm.attributes.instance_state(a2))
             sess2.flush()
-            sess2.clear()
+            sess2.expunge_all()
             eq_(sess2.query(User).get(u2.id).addresses[0].email_address,
                 'somenewaddress')
         except sa.exc.InvalidRequestError, e:
@@ -660,7 +660,7 @@ class MergeTest(_fixtures.FixtureTest):
         sess = create_session()
         u = User()
         u.name = 'ed'
-        sess.save(u)
+        sess.add(u)
         sess.flush()
         sess.expunge(u)
         sess.merge(u)
index 58ebea6ca4176f98d6b597be3f0ee4d4e246e2c7..980165fc0b51effa84bc208d408211289fa65347 100644 (file)
@@ -57,7 +57,7 @@ class NaturalPKTest(_base.MappedTest):
 
         assert sess.query(User).get('jack') is None
 
-        sess.clear()
+        sess.expunge_all()
         u1 = sess.query(User).get('ed')
         self.assertEquals(User(username='ed', fullname='jack'), u1)
 
@@ -80,7 +80,7 @@ class NaturalPKTest(_base.MappedTest):
         sess.expire(u1)
         self.assertRaises(sa.orm.exc.ObjectDeletedError, getattr, u1, 'username')
 
-        sess.clear()
+        sess.expunge_all()
         assert sess.query(User).get('jack') is None
         assert sess.query(User).get('ed').fullname == 'jack'
 
@@ -97,7 +97,7 @@ class NaturalPKTest(_base.MappedTest):
         sess.expire(u1)
         u1.username = 'ed'
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         assert sess.query(User).get('ed').fullname == 'jack'
         
 
@@ -129,7 +129,7 @@ class NaturalPKTest(_base.MappedTest):
         sess.flush()
         assert u1.addresses[0].username == 'ed'
 
-        sess.clear()
+        sess.expunge_all()
         self.assertEquals([Address(username='ed'), Address(username='ed')], sess.query(Address).all())
 
         u1 = sess.query(User).get('ed')
@@ -140,14 +140,14 @@ class NaturalPKTest(_base.MappedTest):
             self.assert_sql_count(testing.db, go, 4) # test passive_updates=False; load addresses, update user, update 2 addresses
         else:
             self.assert_sql_count(testing.db, go, 1) # test passive_updates=True; update user
-        sess.clear()
+        sess.expunge_all()
         assert User(username='jack', addresses=[Address(username='jack'), Address(username='jack')]) == sess.query(User).get('jack')
 
         u1 = sess.query(User).get('jack')
         u1.addresses = []
         u1.username = 'fred'
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         assert sess.query(Address).get('jack1').username is None
         u1 = sess.query(User).get('fred')
         self.assertEquals(User(username='fred', fullname='jack'), u1)
@@ -195,7 +195,7 @@ class NaturalPKTest(_base.MappedTest):
         self.assert_sql_count(testing.db, go, 0)
 
         assert a1.username == a2.username == 'ed'
-        sess.clear()
+        sess.expunge_all()
         self.assertEquals([Address(username='ed'), Address(username='ed')], sess.query(Address).all())
 
     @testing.fails_on('sqlite', 'FIXME: unknown')
@@ -234,7 +234,7 @@ class NaturalPKTest(_base.MappedTest):
         else:
             self.assert_sql_count(testing.db, go, 3)
         self.assertEquals([Address(username='ed'), Address(username='ed')], [ad1, ad2])
-        sess.clear()
+        sess.expunge_all()
         self.assertEquals([Address(username='ed'), Address(username='ed')], sess.query(Address).all())
 
         u1 = sess.query(User).get('ed')
@@ -248,7 +248,7 @@ class NaturalPKTest(_base.MappedTest):
             self.assert_sql_count(testing.db, go, 1)
         else:
             self.assert_sql_count(testing.db, go, 3)
-        sess.clear()
+        sess.expunge_all()
         self.assertEquals([Address(username='fred'), Address(username='fred')], sess.query(Address).all())
 
 
@@ -296,14 +296,14 @@ class NaturalPKTest(_base.MappedTest):
             sess.flush()
         self.assert_sql_count(testing.db, go, 0)
 
-        sess.clear()
+        sess.expunge_all()
         r = sess.query(Item).all()
         self.assertEquals(Item(itemname='item1'), r[0])
         self.assertEquals(['jack'], [u.username for u in r[0].users])
         self.assertEquals(Item(itemname='item2'), r[1])
         self.assertEquals(['ed', 'jack'], sorted([u.username for u in r[1].users]))
         
-        sess.clear()
+        sess.expunge_all()
         u2 = sess.query(User).get(u2.username)
         u2.username='wendy'
         sess.flush()
@@ -400,7 +400,7 @@ class NonPKCascadeTest(_base.MappedTest):
         assert u1.addresses[0].username == 'ed'
         self.assertEquals(sa.select([addresses.c.username]).execute().fetchall(), [('ed',), ('ed',)])
 
-        sess.clear()
+        sess.expunge_all()
         self.assertEquals([Address(username='ed'), Address(username='ed')], sess.query(Address).all())
 
         u1 = sess.query(User).get(u1.id)
@@ -411,15 +411,15 @@ class NonPKCascadeTest(_base.MappedTest):
             self.assert_sql_count(testing.db, go, 4) # test passive_updates=False; load addresses, update user, update 2 addresses
         else:
             self.assert_sql_count(testing.db, go, 1) # test passive_updates=True; update user
-        sess.clear()
+        sess.expunge_all()
         assert User(username='jack', addresses=[Address(username='jack'), Address(username='jack')]) == sess.query(User).get(u1.id)
-        sess.clear()
+        sess.expunge_all()
 
         u1 = sess.query(User).get(u1.id)
         u1.addresses = []
         u1.username = 'fred'
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         a1 = sess.query(Address).get(a1.id)
         self.assertEquals(a1.username, None)
 
index d159d20f4b81d0fc5474c6aaf054f12e0264a8be..1ed3dcc61948f73de98574a6be4b618a73e1f08f 100644 (file)
@@ -52,7 +52,7 @@ class O2OTest(_base.MappedTest):
         p.jack = None
         assert j.port is None
 
-        ctx.clear()
+        ctx.expunge_all()
 
         j = ctx.query(Jack).get(jid)
         p = ctx.query(Port).get(pid)
index d14acdc5056b0b23d88297f550a676a094cf7823..ca308bb5bee1b7f295ad19e974f4e4ca75a61dc8 100644 (file)
@@ -26,7 +26,7 @@ class PickleTest(_fixtures.FixtureTest):
         sess.add(u2)
         sess.flush()
 
-        sess.clear()
+        sess.expunge_all()
 
         self.assertEquals(u1, sess.query(User).get(u2.id))
 
@@ -44,14 +44,14 @@ class PickleTest(_fixtures.FixtureTest):
         u1.addresses.append(Address(email_address='ed@bar.com'))
         sess.add(u1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         u1 = sess.query(User).get(u1.id)
         assert 'name' not in u1.__dict__
         assert 'addresses' not in u1.__dict__
 
         u2 = pickle.loads(pickle.dumps(u1))
         sess2 = create_session()
-        sess2.update(u2)
+        sess2.add(u2)
         self.assertEquals(u2.name, 'ed')
         self.assertEquals(u2, User(name='ed', addresses=[Address(email_address='ed@bar.com')]))
 
@@ -73,7 +73,7 @@ class PickleTest(_fixtures.FixtureTest):
         u1.addresses.append(Address(email_address='ed@bar.com'))
         sess.add(u1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         u1 = sess.query(User).options(sa.orm.defer('name'), sa.orm.defer('addresses.email_address')).get(u1.id)
         assert 'name' not in u1.__dict__
@@ -81,7 +81,7 @@ class PickleTest(_fixtures.FixtureTest):
 
         u2 = pickle.loads(pickle.dumps(u1))
         sess2 = create_session()
-        sess2.update(u2)
+        sess2.add(u2)
         self.assertEquals(u2.name, 'ed')
         assert 'addresses' not in u2.__dict__
         ad = u2.addresses[0]
@@ -132,12 +132,12 @@ class PolymorphicDeferredTest(_base.MappedTest):
         sess = create_session()
         sess.add(eu)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eu = sess.query(User).first()
         eu2 = pickle.loads(pickle.dumps(eu))
         sess2 = create_session()
-        sess2.update(eu2)
+        sess2.add(eu2)
         assert 'email_address' not in eu2.__dict__
         self.assertEquals(eu2.email_address, 'foo@bar.com')
 
index f0633f16d025e698a47570581f1f318dd46809cc..03f578cf7861c32136f42cb0cc5831ce5b989850 100644 (file)
@@ -83,7 +83,7 @@ class GetTest(QueryTest):
         u = s.query(User).get(7)
         u2 = s.query(User).get(7)
         assert u is u2
-        s.clear()
+        s.expunge_all()
         u2 = s.query(User).get(7)
         assert u is not u2
 
@@ -122,7 +122,7 @@ class GetTest(QueryTest):
         u = s.query(User).populate_existing().get(7)
         u2 = s.query(User).populate_existing().get(7)
         assert u is u2
-        s.clear()
+        s.expunge_all()
         u2 = s.query(User).populate_existing().get(7)
         assert u is not u2
 
@@ -714,7 +714,7 @@ class FilterTest(QueryTest):
         self.assertEquals([User(id=7),User(id=8),User(id=9)], sess.query(User).filter(User.addresses!=None).order_by(User.id).all())
 
 
-class FromSelfTest(QueryTest):
+class FromSelfTest(QueryTest, AssertsCompiledSQL):
     def test_filter(self):
 
         assert [User(id=8), User(id=9)] == create_session().query(User).filter(User.id.in_([8,9]))._from_self().all()
@@ -728,8 +728,22 @@ class FromSelfTest(QueryTest):
             (User(id=8), Address(id=3)),
             (User(id=8), Address(id=4)),
             (User(id=9), Address(id=5))
-        ] == create_session().query(User).filter(User.id.in_([8,9]))._from_self().join('addresses').add_entity(Address).order_by(User.id, Address.id).all()
+        ] == create_session().query(User).filter(User.id.in_([8,9]))._from_self().\
+            join('addresses').add_entity(Address).order_by(User.id, Address.id).all()
     
+    def test_no_eagerload(self):
+        """test that eagerloads are pushed outwards and not rendered in subqueries."""
+        
+        s = create_session()
+        
+        self.assert_compile(
+            s.query(User).options(eagerload(User.addresses)).from_self().statement,
+            "SELECT anon_1.users_id, anon_1.users_name, addresses_1.id, addresses_1.user_id, "\
+            "addresses_1.email_address FROM (SELECT users.id AS users_id, users.name AS users_name FROM users) AS anon_1 "\
+            "LEFT OUTER JOIN addresses AS addresses_1 ON anon_1.users_id = addresses_1.user_id ORDER BY addresses_1.id"
+        )
+            
+        
     def test_multiple_entities(self):
         sess = create_session()
 
@@ -748,6 +762,56 @@ class FromSelfTest(QueryTest):
             #    order_by(User.id, Address.id).first(),
             (User(id=8, addresses=[Address(), Address(), Address()]), Address(id=2)),
         )
+    
+class SetOpsTest(QueryTest, AssertsCompiledSQL):
+    
+    def test_union(self):
+        s = create_session()
+        
+        fred = s.query(User).filter(User.name=='fred')
+        ed = s.query(User).filter(User.name=='ed')
+        jack = s.query(User).filter(User.name=='jack')
+        
+        self.assertEquals(fred.union(ed).order_by(User.name).all(), 
+            [User(name='ed'), User(name='fred')]
+        )
+
+        self.assertEquals(fred.union(ed, jack).order_by(User.name).all(), 
+            [User(name='ed'), User(name='fred'), User(name='jack')]
+        )
+        
+    @testing.fails_on('mysql', "mysql doesn't support intersect")
+    def test_intersect(self):
+        s = create_session()
+
+        fred = s.query(User).filter(User.name=='fred')
+        ed = s.query(User).filter(User.name=='ed')
+        jack = s.query(User).filter(User.name=='jack')
+        self.assertEquals(fred.intersect(ed, jack).all(), 
+            []
+        )
+
+        self.assertEquals(fred.union(ed).intersect(ed.union(jack)).all(), 
+            [User(name='ed')]
+        )
+    
+    def test_eager_load(self):
+        s = create_session()
+
+        fred = s.query(User).filter(User.name=='fred')
+        ed = s.query(User).filter(User.name=='ed')
+        jack = s.query(User).filter(User.name=='jack')
+
+        def go():
+            self.assertEquals(
+                fred.union(ed).order_by(User.name).options(eagerload(User.addresses)).all(), 
+                [
+                    User(name='ed', addresses=[Address(), Address(), Address()]), 
+                    User(name='fred', addresses=[Address()])
+                ]
+            )
+        self.assert_sql_count(testing.db, go, 1)
+        
         
 class AggregateTest(QueryTest):
 
@@ -829,7 +893,7 @@ class DistinctTest(QueryTest):
 
         assert [User(id=7), User(id=9), User(id=8)] == q.all()
 
-        sess.clear()
+        sess.expunge_all()
 
         # test that it works on embedded eagerload/LIMIT subquery
         q = sess.query(User).join('addresses').distinct().options(eagerload('addresses')).order_by(desc(Address.email_address)).limit(2)
@@ -1112,7 +1176,7 @@ class JoinTest(QueryTest):
         l = q.order_by(User.id, AdAlias.id).all()
         self.assertEquals(l, expected)
 
-        sess.clear()
+        sess.expunge_all()
 
         q = sess.query(User).add_entity(AdAlias)
         l = q.select_from(outerjoin(User, AdAlias)).filter(AdAlias.email_address=='ed@bettyboop.com').all()
@@ -1365,7 +1429,7 @@ class InstancesTest(QueryTest, AssertsCompiledSQL):
             assert fixtures.user_address_result == l
         self.assert_sql_count(testing.db, go, 1)
 
-        sess.clear()
+        sess.expunge_all()
 
         def go():
             l = q.options(contains_alias('ulist'), contains_eager('addresses')).from_statement(query).all()
@@ -1402,14 +1466,14 @@ class InstancesTest(QueryTest, AssertsCompiledSQL):
         def go():
             assert fixtures.user_address_result == q.all()
         self.assert_sql_count(testing.db, go, 1)
-        sess.clear()
+        sess.expunge_all()
 
         adalias = addresses.alias()
         q = sess.query(User).select_from(users.outerjoin(adalias)).options(contains_eager(User.addresses, alias=adalias))
         def go():
             self.assertEquals(fixtures.user_address_result, q.order_by(User.id).all())
         self.assert_sql_count(testing.db, go, 1)
-        sess.clear()
+        sess.expunge_all()
 
         selectquery = users.outerjoin(addresses).select(users.c.id<10, use_labels=True, order_by=[users.c.id, addresses.c.id])
         q = sess.query(User)
@@ -1419,13 +1483,13 @@ class InstancesTest(QueryTest, AssertsCompiledSQL):
             assert fixtures.user_address_result[0:3] == l
         self.assert_sql_count(testing.db, go, 1)
 
-        sess.clear()
+        sess.expunge_all()
 
         def go():
             l = list(q.options(contains_eager(User.addresses)).instances(selectquery.execute()))
             assert fixtures.user_address_result[0:3] == l
         self.assert_sql_count(testing.db, go, 1)
-        sess.clear()
+        sess.expunge_all()
 
         def go():
             l = q.options(contains_eager('addresses')).from_statement(selectquery).all()
@@ -1443,7 +1507,7 @@ class InstancesTest(QueryTest, AssertsCompiledSQL):
             l = list(q.options(contains_eager('addresses', alias="adalias")).instances(selectquery.execute()))
             assert fixtures.user_address_result == l
         self.assert_sql_count(testing.db, go, 1)
-        sess.clear()
+        sess.expunge_all()
 
         # expression.Alias object
         def go():
@@ -1451,7 +1515,7 @@ class InstancesTest(QueryTest, AssertsCompiledSQL):
             assert fixtures.user_address_result == l
         self.assert_sql_count(testing.db, go, 1)
 
-        sess.clear()
+        sess.expunge_all()
 
         # Aliased object
         adalias = aliased(Address)
@@ -1459,7 +1523,7 @@ class InstancesTest(QueryTest, AssertsCompiledSQL):
             l = q.options(contains_eager('addresses', alias=adalias)).outerjoin((adalias, User.addresses)).order_by(User.id, adalias.id)
             assert fixtures.user_address_result == l.all()
         self.assert_sql_count(testing.db, go, 1)
-        sess.clear()
+        sess.expunge_all()
 
         oalias = orders.alias('o1')
         ialias = items.alias('i1')
@@ -1471,14 +1535,14 @@ class InstancesTest(QueryTest, AssertsCompiledSQL):
             assert fixtures.user_order_result == l
         self.assert_sql_count(testing.db, go, 1)
 
-        sess.clear()
+        sess.expunge_all()
 
         # test using Alias with more than one level deep
         def go():
             l = list(q.options(contains_eager('orders', alias=oalias), contains_eager('orders.items', alias=ialias)).instances(query.execute()))
             assert fixtures.user_order_result == l
         self.assert_sql_count(testing.db, go, 1)
-        sess.clear()
+        sess.expunge_all()
 
         # test using Aliased with more than one level deep
         oalias = aliased(Order)
@@ -1488,7 +1552,7 @@ class InstancesTest(QueryTest, AssertsCompiledSQL):
                 outerjoin((oalias, User.orders), (ialias, oalias.items)).order_by(User.id, oalias.id, ialias.id)
             assert fixtures.user_order_result == l.all()
         self.assert_sql_count(testing.db, go, 1)
-        sess.clear()
+        sess.expunge_all()
 
     def test_mixed_eager_contains_with_limit(self):
         sess = create_session()
@@ -1508,7 +1572,7 @@ class InstancesTest(QueryTest, AssertsCompiledSQL):
                 Order(address_id=None,user_id=7,description=u'order 5',isopen=0,id=5)
             ])])
         self.assert_sql_count(testing.db, go, 1)
-        sess.clear()
+        sess.expunge_all()
 
         def go():
             # same as above, except Order is aliased, so two adapters are applied by the
@@ -1785,25 +1849,25 @@ class MixedEntitiesTest(QueryTest):
 
         selectquery = users.outerjoin(addresses).select(use_labels=True, order_by=[users.c.id, addresses.c.id])
         self.assertEquals(list(sess.query(User, Address).instances(selectquery.execute())), expected)
-        sess.clear()
+        sess.expunge_all()
 
         for address_entity in (Address, aliased(Address)):
             q = sess.query(User).add_entity(address_entity).outerjoin(('addresses', address_entity)).order_by(User.id, address_entity.id)
             self.assertEquals(q.all(), expected)
-            sess.clear()
+            sess.expunge_all()
 
             q = sess.query(User).add_entity(address_entity)
             q = q.join(('addresses', address_entity)).filter_by(email_address='ed@bettyboop.com')
             self.assertEquals(q.all(), [(user8, address3)])
-            sess.clear()
+            sess.expunge_all()
 
             q = sess.query(User, address_entity).join(('addresses', address_entity)).filter_by(email_address='ed@bettyboop.com')
             self.assertEquals(q.all(), [(user8, address3)])
-            sess.clear()
+            sess.expunge_all()
 
             q = sess.query(User, address_entity).join(('addresses', address_entity)).options(eagerload('addresses')).filter_by(email_address='ed@bettyboop.com')
             self.assertEquals(list(util.OrderedSet(q.all())), [(user8, address3)])
-            sess.clear()
+            sess.expunge_all()
 
     def test_aliased_multi_mappers(self):
         sess = create_session()
@@ -1824,7 +1888,7 @@ class MixedEntitiesTest(QueryTest):
         l = q.order_by(User.id, adalias.c.id).all()
         assert l == expected
 
-        sess.clear()
+        sess.expunge_all()
 
         q = sess.query(User).add_entity(Address, alias=adalias)
         l = q.select_from(users.outerjoin(adalias)).filter(adalias.c.email_address=='ed@bettyboop.com').all()
@@ -1837,7 +1901,7 @@ class MixedEntitiesTest(QueryTest):
 
         for add_col in (User.name, users.c.name):
             assert sess.query(User).add_column(add_col).all() == expected
-            sess.clear()
+            sess.expunge_all()
 
         self.assertRaises(sa_exc.InvalidRequestError, sess.query(User).add_column, object())
     
@@ -1865,13 +1929,13 @@ class MixedEntitiesTest(QueryTest):
         q = sess.query(User)
         q = q.group_by([c for c in users.c]).order_by(User.id).outerjoin('addresses').add_column(func.count(Address.id).label('count'))
         self.assertEquals(q.all(), expected)
-        sess.clear()
+        sess.expunge_all()
         
         adalias = aliased(Address)
         q = sess.query(User)
         q = q.group_by([c for c in users.c]).order_by(User.id).outerjoin(('addresses', adalias)).add_column(func.count(adalias.id).label('count'))
         self.assertEquals(q.all(), expected)
-        sess.clear()
+        sess.expunge_all()
 
         s = select([users, func.count(addresses.c.id).label('count')]).select_from(users.outerjoin(addresses)).group_by(*[c for c in users.c]).order_by(User.id)
         q = sess.query(User)
@@ -1901,7 +1965,7 @@ class MixedEntitiesTest(QueryTest):
         l = q.add_column("count").add_column("concat").from_statement(s).all()
         assert l == expected
 
-        sess.clear()
+        sess.expunge_all()
 
         # test with select_from()
         q = create_session().query(User).add_column(func.count(addresses.c.id))\
@@ -1909,21 +1973,21 @@ class MixedEntitiesTest(QueryTest):
             .group_by([c for c in users.c]).order_by(users.c.id)
 
         assert q.all() == expected
-        sess.clear()
+        sess.expunge_all()
 
         q = create_session().query(User).add_column(func.count(addresses.c.id))\
             .add_column(("Name:" + users.c.name)).outerjoin('addresses')\
             .group_by([c for c in users.c]).order_by(users.c.id)
 
         assert q.all() == expected
-        sess.clear()
+        sess.expunge_all()
 
         q = create_session().query(User).add_column(func.count(adalias.c.id))\
             .add_column(("Name:" + users.c.name)).outerjoin(('addresses', adalias))\
             .group_by([c for c in users.c]).order_by(users.c.id)
 
         assert q.all() == expected
-        sess.clear()
+        sess.expunge_all()
 
 
 class ImmediateTest(_fixtures.FixtureTest):
@@ -2127,7 +2191,7 @@ class SelectFromTest(QueryTest):
                 ])
         self.assert_sql_count(testing.db, go, 1)
 
-        sess.clear()
+        sess.expunge_all()
         sel2 = orders.select(orders.c.id.in_([1,2,3]))
         self.assertEquals(sess.query(Order).select_from(sel2).join(['items', 'keywords']).filter(Keyword.name == 'red').order_by(Order.id).all(), [
             Order(description=u'order 1',id=1),
@@ -2156,14 +2220,14 @@ class SelectFromTest(QueryTest):
                 ]
             )
         self.assert_sql_count(testing.db, go, 1)
-        sess.clear()
+        sess.expunge_all()
 
         def go():
             self.assertEquals(sess.query(User).options(eagerload('addresses')).select_from(sel).filter(User.id==8).order_by(User.id).all(),
                 [User(id=8, addresses=[Address(id=2), Address(id=3), Address(id=4)])]
             )
         self.assert_sql_count(testing.db, go, 1)
-        sess.clear()
+        sess.expunge_all()
 
         def go():
             self.assertEquals(sess.query(User).options(eagerload('addresses')).select_from(sel).order_by(User.id)[1], User(id=8, addresses=[Address(id=2), Address(id=3), Address(id=4)]))
@@ -2222,7 +2286,7 @@ class SelfReferentialTest(ORMTest):
         n1.children[1].append(Node(data='n121'))
         n1.children[1].append(Node(data='n122'))
         n1.children[1].append(Node(data='n123'))
-        sess.save(n1)
+        sess.add(n1)
         sess.flush()
         sess.close()
         
@@ -2406,10 +2470,10 @@ class SelfReferentialM2MTest(ORMTest):
         n2.children = [n3, n6, n7]
         n3.children = [n5, n4]
 
-        sess.save(n1)
-        sess.save(n2)
-        sess.save(n3)
-        sess.save(n4)
+        sess.add(n1)
+        sess.add(n2)
+        sess.add(n3)
+        sess.add(n4)
         sess.flush()
         sess.close()
 
@@ -2484,7 +2548,7 @@ class ExternalColumnsTest(QueryTest):
 
         # run the eager version twice to test caching of aliased clauses
         for x in range(2):
-            sess.clear()
+            sess.expunge_all()
             def go():
                self.assertEquals(sess.query(Address).options(eagerload('user')).all(), address_result)
             self.assert_sql_count(testing.db, go, 1)
index 726933a016ba5dfbd3e716d1ffc22530704f9e5b..32a5cce1ffc5ba3207e684fd52a760fe1c7d7823 100644 (file)
@@ -160,7 +160,7 @@ class RelationTest2(_base.MappedTest):
 
         sess.add_all((c1, c2))
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         test_c1 = sess.query(Company).get(c1.company_id)
         test_e1 = sess.query(Employee).get([c1.company_id, e1.emp_id])
@@ -206,7 +206,7 @@ class RelationTest2(_base.MappedTest):
 
         sess.add_all((c1, c2))
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         test_c1 = sess.query(Company).get(c1.company_id)
         test_e1 = sess.query(Employee).get([c1.company_id, e1.emp_id])
@@ -344,14 +344,14 @@ class RelationTest3(_base.MappedTest):
 
         s.flush()
 
-        s.clear()
+        s.expunge_all()
         j = s.query(Job).filter_by(jobno=u'somejob').one()
         oldp = list(j.pages)
         j.pages = []
 
         s.flush()
 
-        s.clear()
+        s.expunge_all()
         j = s.query(Job).filter_by(jobno=u'somejob2').one()
         j.pages[1].current_version = 12
         s.delete(j)
@@ -466,7 +466,7 @@ class RelationTest4(_base.MappedTest):
             sess.flush()
             assert a1 not in sess
             assert b1 not in sess
-            sess.clear()
+            sess.expunge_all()
             sa.orm.clear_mappers()
 
     @testing.resolve_artifact_names
@@ -491,7 +491,7 @@ class RelationTest4(_base.MappedTest):
             sess.flush()
             assert a1 not in sess
             assert b1 not in sess
-            sess.clear()
+            sess.expunge_all()
             sa.orm.clear_mappers()
 
     @testing.resolve_artifact_names
@@ -513,7 +513,7 @@ class RelationTest4(_base.MappedTest):
         sess.flush()
         assert a1 not in sess
         assert b1 not in sess
-        sess.clear()
+        sess.expunge_all()
 
     @testing.resolve_artifact_names
     def test_delete_manual_BtoA(self):
@@ -591,7 +591,7 @@ class RelationTest5(_base.MappedTest):
             con.lineItems.append(li)
             session.add(li)
         session.flush()
-        session.clear()
+        session.expunge_all()
         newcon = session.query(Container).first()
         assert con.policyNum == newcon.policyNum
         assert len(newcon.lineItems) == 10
@@ -639,7 +639,7 @@ class RelationTest6(_base.MappedTest):
         t1.foo.append(TagInstance(data='not_iplc_case'))
         sess.add(t1)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         
         # relation works
         eq_(sess.query(Tag).all(), [Tag(data='some tag', foo=[TagInstance(data='iplc_case')])])
@@ -1010,7 +1010,7 @@ class ViewOnlyOverlappingNames(_base.MappedTest):
         sess.add(c1)
         sess.add(c3)
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         c1 = sess.query(C1).get(c1.id)
         assert set([x.id for x in c1.t2s]) == set([c2a.id, c2b.id])
@@ -1068,7 +1068,7 @@ class ViewOnlyUniqueNames(_base.MappedTest):
 
         sess.add_all((c1, c3))
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         c1 = sess.query(C1).get(c1.t1id)
         assert set([x.t2id for x in c1.t2s]) == set([c2a.t2id, c2b.t2id])
@@ -1188,7 +1188,7 @@ class ViewOnlyRepeatedRemoteColumn(_base.MappedTest):
         sess.add_all((f1, f2))
         sess.flush()
 
-        sess.clear()
+        sess.expunge_all()
         eq_(sess.query(Foo).filter_by(id=f1.id).one(),
             Foo(bars=[Bar(data='b1'), Bar(data='b2')]))
         eq_(sess.query(Foo).filter_by(id=f2.id).one(),
@@ -1235,7 +1235,7 @@ class ViewOnlyRepeatedLocalColumn(_base.MappedTest):
         sess.add_all((b1, b2, b3, b4))
         sess.flush()
 
-        sess.clear()
+        sess.expunge_all()
         eq_(sess.query(Foo).filter_by(id=f1.id).one(),
             Foo(bars=[Bar(data='b1'), Bar(data='b2'), Bar(data='b4')]))
         eq_(sess.query(Foo).filter_by(id=f2.id).one(),
@@ -1286,7 +1286,7 @@ class ViewOnlyComplexJoin(_base.MappedTest):
         sess = create_session()
         sess.add(T2(data='t2', t1=T1(data='t1'), t3s=[T3(data='t3')]))
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         a = sess.query(T1).first()
         eq_(a.t3s, [T3(data='t3')])
@@ -1348,7 +1348,7 @@ class ExplicitLocalRemoteTest(_base.MappedTest):
         b3 = T2(data='b3', t1id='Number2')
         sess.add_all((a1, a2, b1, b2, b3))
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_(sess.query(T1).first(),
             T1(id='number1', data='a1', t2s=[
@@ -1373,7 +1373,7 @@ class ExplicitLocalRemoteTest(_base.MappedTest):
         b3 = T2(data='b3', t1id='Number2')
         sess.add_all((a1, a2, b1, b2, b3))
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_(sess.query(T2).filter(T2.data.in_(['b1', 'b2'])).all(),
             [T2(data='b1', t1=[T1(id='number1', data='a1')]),
@@ -1396,7 +1396,7 @@ class ExplicitLocalRemoteTest(_base.MappedTest):
         b3 = T2(data='b2', t1id='number2')
         sess.add_all((a1, a2, b1, b2, b3))
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_(sess.query(T1).first(),
             T1(id='NuMbeR1', data='a1', t2s=[
@@ -1420,7 +1420,7 @@ class ExplicitLocalRemoteTest(_base.MappedTest):
         b3 = T2(data='b3', t1id='number2')
         sess.add_all((a1, a2, b1, b2, b3))
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_(sess.query(T2).filter(T2.data.in_(['b1', 'b2'])).all(),
             [T2(data='b1', t1=[T1(id='NuMbeR1', data='a1')]),
index eea855490d003387d5c442200350989d4cbade1f..bdfc5a9d58bba3c1b55824f06ec6dbc2106810e8 100644 (file)
@@ -105,7 +105,7 @@ class ScopedMapperTest(_ScopedTest):
         sso = SomeOtherObject()
         s.options.append(sso)
         Session.flush()
-        Session.clear()
+        Session.expunge_all()
 
     @testing.resolve_artifact_names
     def test_query(self):
@@ -225,7 +225,7 @@ class ScopedMapperTest2(_ScopedTest):
         b = BaseClass(data='b1')
         s =  SubClass(data='s1', somedata='somedata')
         Session.commit()
-        Session.clear()
+        Session.expunge_all()
 
         eq_(expunge_list([BaseClass(data='b1'),
                           SubClass(data='s1', somedata='somedata')]),
index 1e4527e6bbfdd01ee5bc783f6d779951a2ec5953..74c41c85230d8e4da321bd818636f38dccf54a21 100644 (file)
@@ -37,7 +37,7 @@ class SelectableNoFromsTest(_base.MappedTest):
         sess = create_session(bind=testing.db)
         sess.add(Subset(data=1))
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
 
         eq_(sess.query(Subset).all(), [Subset(data=1)])
         eq_(sess.query(Subset).filter(Subset.data==1).one(), Subset(data=1))
index 180ef745d3c9dcbb2ad0030cda8d0c0b93fc0f77..e1eaf82cfc6476f202a5bdbd1aec82a9889286fe 100644 (file)
@@ -648,6 +648,7 @@ class SessionTest(_fixtures.FixtureTest):
         assert c.scalar("select count(1) from users") == 1
 
 
+    @testing.uses_deprecated()
     @engines.close_open_connections
     @testing.resolve_artifact_names
     def test_save_update_delete(self):
@@ -671,19 +672,19 @@ class SessionTest(_fixtures.FixtureTest):
 
         # modify outside of session, assert changes remain/get saved
         user.name = "fred"
-        s.update(user)
+        s.add(user)
         assert user in s
         assert user in s.dirty
         s.flush()
-        s.clear()
+        s.expunge_all()
         assert s.query(User).count() == 1
         user = s.query(User).one()
         assert user.name == 'fred'
 
         # ensure its not dirty if no changes occur
-        s.clear()
+        s.expunge_all()
         assert user not in s
-        s.update(user)
+        s.add(user)
         assert user in s
         assert user not in s.dirty
 
@@ -716,7 +717,7 @@ class SessionTest(_fixtures.FixtureTest):
         u = User(name='fred')
         s.add(u)
         s.flush()
-        s.clear()
+        s.expunge_all()
 
         user = s.query(User).one()
         assert user not in s.dirty
@@ -858,7 +859,7 @@ class SessionTest(_fixtures.FixtureTest):
         assert a not in s
         s.flush()
         print "\n".join([repr(x.__dict__) for x in s])
-        s.clear()
+        s.expunge_all()
         assert s.query(User).one().id == u.id
         assert s.query(Address).first() is None
 
@@ -878,7 +879,7 @@ class SessionTest(_fixtures.FixtureTest):
         assert u not in s
         assert a in s
         s.flush()
-        s.clear()
+        s.expunge_all()
         assert s.query(Address).one().id == a.id
         assert s.query(User).first() is None
 
@@ -1017,7 +1018,7 @@ class SessionTest(_fixtures.FixtureTest):
         
         sess.add(User(name='u2'))
         sess.flush()
-        sess.clear()
+        sess.expunge_all()
         self.assertEquals(sess.query(User).order_by(User.name).all(), 
             [
                 User(name='u1 modified'),
@@ -1073,7 +1074,7 @@ class SessionTest(_fixtures.FixtureTest):
         assert u2 is not None and u2 is not u1
         assert u2 in sess
 
-        self.assertRaises(Exception, lambda: sess.update(u1))
+        self.assertRaises(Exception, lambda: sess.add(u1))
 
         sess.expunge(u2)
         assert u2 not in sess
@@ -1082,13 +1083,13 @@ class SessionTest(_fixtures.FixtureTest):
         u1.name = "John"
         u2.name = "Doe"
 
-        sess.update(u1)
+        sess.add(u1)
         assert u1 in sess
         assert Session.object_session(u1) is sess
 
         sess.flush()
 
-        sess.clear()
+        sess.expunge_all()
 
         u3 = sess.query(User).get(u1.id)
         assert u3 is not u1 and u3 is not u2 and u3.name == u1.name
@@ -1173,7 +1174,7 @@ class DisposedStates(testing.ORMTest):
         self._test_session().flush()
     
     def test_clear(self):
-        self._test_session().clear()
+        self._test_session().expunge_all()
     
     def test_close(self):
         self._test_session().close()
@@ -1217,6 +1218,7 @@ class SessionInterface(testing.TestBase):
         return mapper(cls, Table('t', sa.MetaData(),
                                  Column('id', Integer, primary_key=True)))
 
+    @testing.uses_deprecated()
     def _test_instance_guards(self, user_arg):
         watchdog = set()
 
index 63f6932ea83c2cb4fcd73d49bb94d9bc740c3887..10aaee131b57656dcca47f16acaa8ca04c72b375 100644 (file)
@@ -138,10 +138,10 @@ class ShardTest(TestBase):
 
         sess = create_session()
         for c in [tokyo, newyork, toronto, london, dublin, brasilia, quito]:
-            sess.save(c)
+            sess.add(c)
         sess.commit()
         tokyo.city   # reload 'city' attribute on tokyo
-        sess.clear()
+        sess.expunge_all()
 
         eq_(db2.execute(weather_locations.select()).fetchall(), [(1, 'Asia', 'Tokyo')])
         eq_(db1.execute(weather_locations.select()).fetchall(), [(2, 'North America', 'New York'), (3, 'North America', 'Toronto')])
index 5c3fd8342d24b0c871cb69d814a844b6c3484d38..cad303a0c5edf5b8077dca2ba4f52c8352b3aeab 100644 (file)
@@ -282,6 +282,19 @@ class SavepointTest(TransactionTest):
         assert u2.name == 'jack'
         self.assertEquals(s.query(User.name).order_by(User.id).all(), [('ed',), ('jack',)])
 
+    @testing.requires.savepoints
+    def test_savepoint_delete(self):
+        s = self.session()
+        u1 = User(name='ed')
+        s.add(u1)
+        s.commit()
+        self.assertEquals(s.query(User).filter_by(name='ed').count(), 1)
+        s.begin_nested()
+        s.delete(u1)
+        s.commit()
+        self.assertEquals(s.query(User).filter_by(name='ed').count(), 0)
+        s.commit()
+
     @testing.requires.savepoints
     def test_savepoint_commit(self):
         s = self.session()
index 553713da539fe233bcbe1d1f2d9d793463d9e331..7a8415cdc31ee33b2f4bc0378b92ff8ddf7ae013 100644 (file)
@@ -42,7 +42,7 @@ class HistoryTest(_fixtures.FixtureTest):
 
         self.assert_(u.addresses == [a])
         session.commit()
-        session.clear()
+        session.expunge_all()
 
         u = session.query(m).one()
         assert u.addresses[0].user == u
@@ -252,23 +252,23 @@ class UnicodeSchemaTest(engine_base.AltEngineTest, _base.MappedTest):
         session = create_session()
         session.add(a1)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         new_a1 = session.query(A).filter(t1.c.a == a1.a).one()
         assert new_a1.a == a1.a
         assert new_a1.t2s[0].d == b1.d
-        session.clear()
+        session.expunge_all()
 
         new_a1 = (session.query(A).options(sa.orm.eagerload('t2s')).
                   filter(t1.c.a == a1.a)).one()
         assert new_a1.a == a1.a
         assert new_a1.t2s[0].d == b1.d
-        session.clear()
+        session.expunge_all()
 
         new_a1 = session.query(A).filter(A.a == a1.a).one()
         assert new_a1.a == a1.a
         assert new_a1.t2s[0].d == b1.d
-        session.clear()
+        session.expunge_all()
 
     @testing.fails_on('mssql', 'pyodbc returns a non unicode encoding of the results description.')
     @testing.resolve_artifact_names
@@ -290,7 +290,7 @@ class UnicodeSchemaTest(engine_base.AltEngineTest, _base.MappedTest):
         session = create_session()
         session.add_all((a1, b1))
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         eq_([A(b=5), B(e=7)], session.query(A).all())
 
@@ -322,7 +322,7 @@ class MutableTypesTest(_base.MappedTest):
         session = create_session()
         session.add(f1)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         f2 = session.query(Foo).filter_by(id=f1.id).one()
         assert 'data' in sa.orm.attributes.instance_state(f2).unmodified
@@ -332,7 +332,7 @@ class MutableTypesTest(_base.MappedTest):
         assert f2 in session.dirty
         assert 'data' not in sa.orm.attributes.instance_state(f2).unmodified
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         f3 = session.query(Foo).filter_by(id=f1.id).one()
         ne_(f3.data,f1.data)
@@ -403,7 +403,7 @@ class MutableTypesTest(_base.MappedTest):
         session = create_session(autocommit=False)
         session.add(f1)
         session.commit()
-        session.clear()
+        session.expunge_all()
 
         f1 = session.query(Foo).get(f1.id)
         f1.val = u'hi'
@@ -474,7 +474,7 @@ class PickledDicts(_base.MappedTest):
         f1.data[0]['personne']['VenSoir']= False
         self.sql_count_(1, session.commit)
 
-        session.clear()
+        session.expunge_all()
         f = session.query(Foo).get(f1.id)
         eq_(f.data,
             [ {
@@ -530,7 +530,7 @@ class PKTest(_base.MappedTest):
         session = create_session()
         session.add(e)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         e2 = session.query(Entry).get((e.multi_id, 2))
         self.assert_(e is not e2)
@@ -655,7 +655,7 @@ class ClauseAttributesTest(_base.MappedTest):
             assert (u.counter == 2) is True
         self.sql_count_(1, go)
 
-        session.clear()
+        session.expunge_all()
         u = session.query(User).get(u.id)
         eq_(u.name, 'test2')
         eq_(u.counter,  2)
@@ -711,7 +711,7 @@ class PassiveDeletesTest(_base.MappedTest):
 
         session.add(mc)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         assert myothertable.count().scalar() == 4
         mc = session.query(MyClass).get(mc.id)
@@ -801,7 +801,7 @@ class ExtraPassiveDeletesTest(_base.MappedTest):
         mc.children.append(MyOtherClass())
         session.add(mc)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         assert myothertable.count().scalar() == 4
         mc = session.query(MyClass).get(mc.id)
@@ -821,7 +821,7 @@ class ExtraPassiveDeletesTest(_base.MappedTest):
         mc.children.append(MyOtherClass())
         session.add(mc)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         assert myothertable.count().scalar() == 1
 
@@ -922,7 +922,7 @@ class DefaultTest(_base.MappedTest):
             self.assert_(h5.foober == 'im the new foober')
         self.sql_count_(0, go)
 
-        session.clear()
+        session.expunge_all()
 
         (h1, h2, h3, h4, h5) = session.query(Hoho).order_by(Hoho.id).all()
 
@@ -995,7 +995,7 @@ class DefaultTest(_base.MappedTest):
         session = create_session()
         session.add(h1)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         eq_(session.query(Hoho).get(h1.id),
             Hoho(hoho=hohoval,
@@ -1005,7 +1005,7 @@ class DefaultTest(_base.MappedTest):
         h1 = session.query(Hoho).get(h1.id)
         h1.secondaries.append(Secondary(data='s2'))
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         eq_(session.query(Hoho).get(h1.id),
             Hoho(hoho=hohoval,
@@ -1189,7 +1189,7 @@ class OneToManyTest(_fixtures.FixtureTest):
         session.delete(u1)
 
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         u2 = session.query(User).get(u2.id)
         eq_(len(u2.addresses), 1)
@@ -1212,7 +1212,7 @@ class OneToManyTest(_fixtures.FixtureTest):
         u2.addresses.append(a)
 
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         u2 = session.query(User).get(u2.id)
         eq_(len(u2.addresses), 1)
@@ -1317,7 +1317,7 @@ class SaveTest(_fixtures.FixtureTest):
         assert u is nu
 
         # clear out the identity map, so next get forces a SELECT
-        session.clear()
+        session.expunge_all()
 
         # check it again, identity should be different but ids the same
         nu = session.query(m).get(u.id)
@@ -1325,7 +1325,7 @@ class SaveTest(_fixtures.FixtureTest):
 
         # change first users name and save
         session = create_session()
-        session.update(u)
+        session.add(u)
         u.name = 'modifiedname'
         assert u in session.dirty
         session.flush()
@@ -1358,7 +1358,7 @@ class SaveTest(_fixtures.FixtureTest):
         session = create_session()
         session.add(u)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         u = session.query(SUser).first()
         eq_(u.syn_name, 'User:some name:User')
@@ -1383,7 +1383,7 @@ class SaveTest(_fixtures.FixtureTest):
         session = create_session()
         session.add(u)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         u = session.query(User).one()
         u.name = 'newname'
@@ -1407,7 +1407,7 @@ class SaveTest(_fixtures.FixtureTest):
         session = create_session()
         session.add(au)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         rt = session.query(AddressUser).one()
         eq_(au.user_id, rt.user_id)
@@ -1432,7 +1432,7 @@ class SaveTest(_fixtures.FixtureTest):
 
         eq_(list(session.execute(orders.select(), mapper=Order)),
             [(42, None, None, 'foo', None)])
-        session.clear()
+        session.expunge_all()
 
         # assert that a set operation doesn't trigger a load operation
         o = session.query(Order).filter(Order.description == 'foo').one()
@@ -1444,7 +1444,7 @@ class SaveTest(_fixtures.FixtureTest):
         eq_(list(session.execute(orders.select(), mapper=Order)),
             [(42, None, None, 'hoho', None)])
 
-        session.clear()
+        session.expunge_all()
 
         # test assigning None to an unloaded deferred also works
         o = session.query(Order).filter(Order.description == 'hoho').one()
@@ -1465,7 +1465,7 @@ class SaveTest(_fixtures.FixtureTest):
         session = create_session()
         session.add(u)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         u = session.query(User).get(u.id)
         u.name = ''
@@ -1490,7 +1490,7 @@ class SaveTest(_fixtures.FixtureTest):
         session = create_session()
         session.add(u)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         id = m.primary_key_from_instance(u)
 
@@ -1511,7 +1511,7 @@ class SaveTest(_fixtures.FixtureTest):
         address_rows = addresses.select(addresses.c.id.in_([u.id])).execute().fetchall()
         eq_(address_rows[0].values(), [u.id, u.foo_id, 'lala@hey.com'])
 
-        session.clear()
+        session.expunge_all()
         u = session.query(User).get(id)
         assert u.name == 'imnew'
 
@@ -1528,7 +1528,7 @@ class SaveTest(_fixtures.FixtureTest):
         session = create_session()
         session.add(u)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         u = session.query(User).get(u.id)
         session.delete(u)
@@ -1565,7 +1565,7 @@ class SaveTest(_fixtures.FixtureTest):
         
         # test insert ordering is maintained
         assert names == ['user1', 'user2', 'user4', 'user5', 'user3']
-        session.clear()
+        session.expunge_all()
         
         sa.orm.clear_mappers()
 
@@ -1643,7 +1643,7 @@ class ManyToOneTest(_fixtures.FixtureTest):
         session = create_session()
         session.add(a1)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         a1 = session.query(Address).get(a1.id)
         u1 = session.query(User).get(u1.id)
@@ -1651,7 +1651,7 @@ class ManyToOneTest(_fixtures.FixtureTest):
 
         a1.user = None
         session.flush()
-        session.clear()
+        session.expunge_all()
         a1 = session.query(Address).get(a1.id)
         u1 = session.query(User).get(u1.id)
         assert a1.user is None
@@ -1669,7 +1669,7 @@ class ManyToOneTest(_fixtures.FixtureTest):
         session = create_session()
         session.add_all((a1, a2))
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         a1 = session.query(Address).get(a1.id)
         a2 = session.query(Address).get(a2.id)
@@ -1679,7 +1679,7 @@ class ManyToOneTest(_fixtures.FixtureTest):
         a1.user = None
         a2.user = u1
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         a1 = session.query(Address).get(a1.id)
         a2 = session.query(Address).get(a2.id)
@@ -1700,7 +1700,7 @@ class ManyToOneTest(_fixtures.FixtureTest):
         session = create_session()
         session.add_all((a1, u1, u2))
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         a1 = session.query(Address).get(a1.id)
         u1 = session.query(User).get(u1.id)
@@ -1709,7 +1709,7 @@ class ManyToOneTest(_fixtures.FixtureTest):
 
         a1.user = u2
         session.flush()
-        session.clear()
+        session.expunge_all()
         a1 = session.query(Address).get(a1.id)
         u1 = session.query(User).get(u1.id)
         u2 = session.query(User).get(u2.id)
@@ -1729,13 +1729,13 @@ class ManyToOneTest(_fixtures.FixtureTest):
         session = create_session()
         session.add(u1)
         session.flush()
-        session.clear()
+        session.expunge_all()
 
         a1 = session.query(Address).get(a1.id)
 
         a1.user = None
         session.flush()
-        session.clear()
+        session.expunge_all()
         assert session.query(Address).get(a1.id).user is None
         assert session.query(User).get(u1.id).addresses == []
 
@@ -1916,7 +1916,7 @@ class ManyToManyTest(_fixtures.FixtureTest):
         item.keywords.append(k2)
         session.flush()
 
-        session.clear()
+        session.expunge_all()
         item = session.query(Item).get(item.id)
         assert item.keywords == [k1, k2]
 
@@ -2076,13 +2076,13 @@ class BooleanColTest(_base.MappedTest):
 
         for clear in (False, True):
             if clear:
-                sess.clear()
+                sess.expunge_all()
             eq_(sess.query(T).all(), [T(value=True, name="t1"), T(value=False, name="t2"), T(value=True, name="t3")])
             if clear:
-                sess.clear()
+                sess.expunge_all()
             eq_(sess.query(T).filter(T.value==True).all(), [T(value=True, name="t1"),T(value=True, name="t3")])
             if clear:
-                sess.clear()
+                sess.expunge_all()
             eq_(sess.query(T).filter(T.value==False).all(), [T(value=False, name="t2")])
 
         t2 = sess.query(T).get(t2.id)
@@ -2160,7 +2160,7 @@ class RowSwitchTest(_base.MappedTest):
     @testing.resolve_artifact_names
     def test_manytomany(self):
         mapper(T5, t5, properties={
-            't7s':relation(T7, secondary=t5t7, cascade="all, delete-orphan")
+            't7s':relation(T7, secondary=t5t7, cascade="all")
         })
         mapper(T7, t7)
 
index ab6a5e2c0aca17df3588529ba67b60cfdcbc9339..8bc2825db873e9686215f297fcf2ace8cd57e0b3 100644 (file)
@@ -101,7 +101,7 @@ class MemUsageTest(EnsureZeroed):
             for x in [a1,a2,a3]:
                 sess.add(x)
             sess.flush()
-            sess.clear()
+            sess.expunge_all()
 
             alist = sess.query(A).all()
             self.assertEquals(
@@ -152,7 +152,7 @@ class MemUsageTest(EnsureZeroed):
             for x in [a1,a2,a3]:
                 sess.add(x)
             sess.flush()
-            sess.clear()
+            sess.expunge_all()
 
             alist = sess.query(A).order_by(A.col1).all()
             self.assertEquals(
@@ -212,7 +212,7 @@ class MemUsageTest(EnsureZeroed):
             for x in [a1,a2,b1, b2]:
                 sess.add(x)
             sess.flush()
-            sess.clear()
+            sess.expunge_all()
 
             alist = sess.query(A).order_by(A.col1).all()
             self.assertEquals(
@@ -276,7 +276,7 @@ class MemUsageTest(EnsureZeroed):
             for x in [a1,a2]:
                 sess.add(x)
             sess.flush()
-            sess.clear()
+            sess.expunge_all()
 
             alist = sess.query(A).order_by(A.col1).all()
             self.assertEquals(
@@ -300,6 +300,45 @@ class MemUsageTest(EnsureZeroed):
             metadata.drop_all()
         assert_no_mappers()
 
+    def test_join_cache(self):
+        metadata = MetaData(testing.db)
+
+        table1 = Table("table1", metadata,
+            Column('id', Integer, primary_key=True),
+            Column('data', String(30))
+            )
+
+        table2 = Table("table2", metadata,
+            Column('id', Integer, primary_key=True),
+            Column('data', String(30)),
+            Column('t1id', Integer, ForeignKey('table1.id'))
+            )
+        
+        class Foo(object):
+            pass
+            
+        class Bar(object):
+            pass
+            
+        mapper(Foo, table1, properties={
+            'bars':relation(mapper(Bar, table2))
+        })
+        metadata.create_all()
+
+        session = sessionmaker()
+        
+        @profile_memory
+        def go():
+            s = table2.select()
+            sess = session()
+            sess.query(Foo).join((s, Foo.bars)).all()
+            sess.rollback()
+        try:
+            go()
+        finally:
+            metadata.drop_all()
+            
+            
     def test_mutable_identity(self):
         metadata = MetaData(testing.db)
 
index 8d5c28c69e4088c20284126bb36f9eea71358821..7a189f87313ed027268cbd93f28dbe25d4c11b8b 100644 (file)
@@ -88,7 +88,7 @@ class ZooMarkTest(TestBase):
                            LastEscape=datetime.datetime(2004, 7, 29, 5, 6, 7),
                            Admission=4.95,
                            )
-        session.save(wap)
+        session.add(wap)
         sdz = Zoo(Name =u'San Diego Zoo',
                            # This early date should play havoc with a number
                            # of implementations.
@@ -96,7 +96,7 @@ class ZooMarkTest(TestBase):
                            Opens = datetime.time(9, 0, 0),
                            Admission = 0,
                            )
-        session.save(sdz)
+        session.add(sdz)
         
         bio = Zoo(
                   Name = u'Montr\xe9al Biod\xf4me',
@@ -104,11 +104,11 @@ class ZooMarkTest(TestBase):
                   Opens = datetime.time(9, 0, 0),
                   Admission = 11.75,
                   )
-        session.save(bio)
+        session.add(bio)
         
         seaworld = Zoo(
                 Name =u'Sea_World', Admission = 60)
-        session.save(seaworld)
+        session.add(seaworld)
         
         # Let's add a crazy futuristic Zoo to test large date values.
         lp = Zoo(Name =u'Luna Park',
@@ -116,40 +116,40 @@ class ZooMarkTest(TestBase):
                                   Opens = datetime.time(0, 0, 0),
                                   Admission = 134.95,
                                   )
-        session.save(lp)
+        session.add(lp)
         session.flush()
         
         # Animals
         leopard = Animal(Species=u'Leopard', Lifespan=73.5,)
-        session.save(leopard)
+        session.add(leopard)
         leopard.ZooID = wap.ID
         leopard.LastEscape = datetime.datetime(2004, 12, 21, 8, 15, 0, 999907)
         
-        session.save(Animal(Species=u'Lion', ZooID=wap.ID))
-        session.save(Animal(Species=u'Slug', Legs=1, Lifespan=.75))
-        session.save(Animal(Species=u'Tiger', ZooID=sdz.ID))
+        session.add(Animal(Species=u'Lion', ZooID=wap.ID))
+        session.add(Animal(Species=u'Slug', Legs=1, Lifespan=.75))
+        session.add(Animal(Species=u'Tiger', ZooID=sdz.ID))
         
         # Override Legs.default with itself just to make sure it works.
-        session.save(Animal(Species=u'Bear', Legs=4))
-        session.save(Animal(Species=u'Ostrich', Legs=2, Lifespan=103.2))
-        session.save(Animal(Species=u'Centipede', Legs=100))
+        session.add(Animal(Species=u'Bear', Legs=4))
+        session.add(Animal(Species=u'Ostrich', Legs=2, Lifespan=103.2))
+        session.add(Animal(Species=u'Centipede', Legs=100))
         
-        session.save(Animal(Species=u'Emperor Penguin', Legs=2, ZooID=seaworld.ID))
-        session.save(Animal(Species=u'Adelie Penguin', Legs=2, ZooID=seaworld.ID))
+        session.add(Animal(Species=u'Emperor Penguin', Legs=2, ZooID=seaworld.ID))
+        session.add(Animal(Species=u'Adelie Penguin', Legs=2, ZooID=seaworld.ID))
         
-        session.save(Animal(Species=u'Millipede', Legs=1000000, ZooID=sdz.ID))
+        session.add(Animal(Species=u'Millipede', Legs=1000000, ZooID=sdz.ID))
         
         # Add a mother and child to test relationships
         bai_yun = Animal(Species=u'Ape', Nameu=u'Bai Yun', Legs=2)
-        session.save(bai_yun)
-        session.save(Animal(Species=u'Ape', Name=u'Hua Mei', Legs=2,
+        session.add(bai_yun)
+        session.add(Animal(Species=u'Ape', Name=u'Hua Mei', Legs=2,
                          MotherID=bai_yun.ID))
         session.flush()
         session.commit()
 
     def test_baseline_2_insert(self):
         for x in xrange(ITERATIONS):
-            session.save(Animal(Species=u'Tick', Name=u'Tick %d' % x, Legs=8))
+            session.add(Animal(Species=u'Tick', Name=u'Tick %d' % x, Legs=8))
         session.flush()
 
     def test_baseline_3_properties(self):
index 39a72d89b5a5785a6d386552ddc1c6f1e3933c41..2072fb75e87334a6444c8c6ad71eda0a719bb3ea 100644 (file)
@@ -284,6 +284,11 @@ class ClauseTest(TestBase, AssertsCompiledSQL):
         assert str(u) == str(u2) == str(u3)
         assert u2.compile().params == {'id_param':7}
         assert u3.compile().params == {'id_param':10}
+    
+    def test_adapt_union(self):
+        u = union(t1.select().where(t1.c.col1==4), t1.select().where(t1.c.col1==5)).alias()
+        
+        assert sql_util.ClauseAdapter(u).traverse(t1) is u
         
     def test_binds(self):
         """test that unique bindparams change their name upon clone() to prevent conflicts"""
index 0e45aff1071ad578bf6636ca388e0c5451f6314c..d0da2bf054e07e097122700e2ac3a6390bc479a1 100644 (file)
@@ -687,7 +687,9 @@ class PercentSchemaNamesTest(TestBase):
             Column("spaces % more spaces", Integer),
         )
         metadata.create_all()
-        
+
+    @testing.crashes('mysql', 'mysqldb calls name % (params)')
+    @testing.crashes('postgres', 'postgres calls name % (params)')
     def tearDownAll(self):
         metadata.drop_all()
     
@@ -702,26 +704,41 @@ class PercentSchemaNamesTest(TestBase):
             {'percent%':9, '%(oneofthese)s':9, 'spaces % more spaces':10},
             {'percent%':11, '%(oneofthese)s':10, 'spaces % more spaces':9},
         )
-        eq_(
-            percent_table.select().order_by(percent_table.c['%(oneofthese)s']).execute().fetchall(),
-            [
-                (5, 7, 12),
-                (7, 8, 11),
-                (9, 9, 10),
-                (11, 10, 9)
-            ]
-        )
-        result = percent_table.select().order_by(percent_table.c['%(oneofthese)s']).execute()
-        row = result.fetchone()
-        eq_(row[percent_table.c['percent%']], 5)
-        eq_(row[percent_table.c['%(oneofthese)s']], 7)
-        eq_(row[percent_table.c['spaces % more spaces']], 12)
-        row = result.fetchone()
-        eq_(row['percent%'], 7)
-        eq_(row['%(oneofthese)s'], 8)
-        eq_(row['spaces % more spaces'], 11)
-        result.close()
+        
+        for table in (percent_table, percent_table.alias()):
+            eq_(
+                table.select().order_by(table.c['%(oneofthese)s']).execute().fetchall(),
+                [
+                    (5, 7, 12),
+                    (7, 8, 11),
+                    (9, 9, 10),
+                    (11, 10, 9)
+                ]
+            )
+
+            eq_(
+                table.select().
+                    where(table.c['spaces % more spaces'].in_([9, 10])).
+                    order_by(table.c['%(oneofthese)s']).execute().fetchall(),
+                    [
+                        (9, 9, 10),
+                        (11, 10, 9)
+                    ]
+            )
+
+            result = table.select().order_by(table.c['%(oneofthese)s']).execute()
+            row = result.fetchone()
+            eq_(row[table.c['percent%']], 5)
+            eq_(row[table.c['%(oneofthese)s']], 7)
+            eq_(row[table.c['spaces % more spaces']], 12)
+            row = result.fetchone()
+            eq_(row['percent%'], 7)
+            eq_(row['%(oneofthese)s'], 8)
+            eq_(row['spaces % more spaces'], 11)
+            result.close()
+
         percent_table.update().values({percent_table.c['%(oneofthese)s']:9, percent_table.c['spaces % more spaces']:15}).execute()
+
         eq_(
             percent_table.select().order_by(percent_table.c['percent%']).execute().fetchall(),
             [
index 4f77d350d36e8870d7387bc4fcbab07d00fbaca7..f784c27962c74c9579484001f88ab54450575439 100644 (file)
@@ -34,8 +34,8 @@ class SavePostTest(ZBlogTest):
         user = User('zbloguser', "Zblog User", "hello", group=administrator)
         blog = Blog(owner=user)
         blog.name = "this is a blog"
-        s.save(user)
-        s.save(blog)
+        s.add(user)
+        s.add(blog)
         s.flush()
         blog_id = blog.id
         user_id = user.id
@@ -55,7 +55,7 @@ class SavePostTest(ZBlogTest):
         try:
             blog = s.query(Blog).get(blog_id)
             post = Post(headline="asdf asdf", summary="asdfasfd")
-            s.save(post)
+            s.add(post)
             post.blog_id=blog_id
             post.blog = blog
             assert post in blog.posts
@@ -74,9 +74,9 @@ class SavePostTest(ZBlogTest):
             post.blog = blog
             user = s.query(User).get(user_id)
             post.user = user
-            s.save(post)
+            s.add(post)
             s.flush()
-            s.clear()
+            s.expunge_all()
 
             user = s.query(User).get(user_id)
             blog = s.query(Blog).get(blog_id)
@@ -85,7 +85,7 @@ class SavePostTest(ZBlogTest):
             comment.post = post
             comment.user = user
             s.flush()
-            s.clear()
+            s.expunge_all()
 
             assert s.query(Post).get(post.id) is not None