]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- random performance whacking vs. 0.9, in particular we have to watch
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 8 Mar 2015 19:32:21 +0000 (15:32 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 8 Mar 2015 19:32:21 +0000 (15:32 -0400)
for the slots-based __getattr__ thing getting hit

examples/performance/__init__.py
examples/performance/large_resultsets.py
examples/performance/short_selects.py
lib/sqlalchemy/orm/base.py
lib/sqlalchemy/orm/query.py
lib/sqlalchemy/sql/selectable.py

index a4edfce3633f87b30fa798639a6cc4929655de85..5a1aeeb702f3bb082cb453b3bfb238e666a011a7 100644 (file)
@@ -298,6 +298,7 @@ class Profiler(object):
             pr.disable()
 
         stats = pstats.Stats(pr).sort_stats('cumulative')
+        #stats.print_callers()
 
         self.stats.append(TestResult(self, fn, stats=stats))
         return result
index fbe77c759af31e6c876b48ddcbedd76ee6f7de06..c13683040acead2c70c843b370fe556275202ddd 100644 (file)
@@ -42,12 +42,13 @@ def setup_database(dburl, echo, num):
 
     s = Session(engine)
     for chunk in range(0, num, 10000):
-        s.bulk_insert_mappings(Customer, [
-            {
-                'name': 'customer name %d' % i,
-                'description': 'customer description %d' % i
-            } for i in range(chunk, chunk + 10000)
-        ])
+        s.execute(
+            Customer.__table__.insert(),
+            params=[
+                {
+                    'name': 'customer name %d' % i,
+                    'description': 'customer description %d' % i
+                } for i in range(chunk, chunk + 10000)])
     s.commit()
 
 
index d81dc0dbbc18fe5dc4064591a63d0dcb322c531d..333fb9632354490771e71393efd7dc415dadb5b1 100644 (file)
@@ -41,10 +41,10 @@ def setup_database(dburl, echo, num):
     sess.add_all([
         Customer(
             id=i, name='c%d' % i, description="c%d" % i,
-            q="q%d" % i,
-            p="p%d" % i,
-            x="x%d" % i,
-            y="y%d" % i,
+            q=i * 10,
+            p=i * 20,
+            x=i * 30,
+            y=i * 40,
         )
         for i in ids
     ])
index 875443e60d5497771620984c47546ee3b1364008..c3f95fa1099e49e43b00bf9112220f8d7848f33a 100644 (file)
@@ -327,7 +327,7 @@ def _is_mapped_class(entity):
 
     insp = inspection.inspect(entity, False)
     return insp is not None and \
-        hasattr(insp, "mapper") and \
+        not insp.is_clause_element and \
         (
             insp.is_mapper
             or insp.is_aliased_class
index eac2da0836861dbd9e4c3f2a4216d67af3ec171a..fdee986d3c0faff0226d80515d43e0b301feda14 100644 (file)
@@ -3342,6 +3342,12 @@ class Bundle(object):
     """If True, queries for a single Bundle will be returned as a single
     entity, rather than an element within a keyed tuple."""
 
+    is_clause_element = False
+
+    is_mapper = False
+
+    is_aliased_class = False
+
     def __init__(self, name, *exprs, **kw):
         """Construct a new :class:`.Bundle`.
 
index 87029ec2bde6e840c67a207c4fc1270f18e0b6bf..3384939b081ef463a39d9389af13fbedf966569e 100644 (file)
@@ -2484,21 +2484,20 @@ class Select(HasPrefixes, HasSuffixes, GenerativeSelect):
         seen = set()
         translate = self._from_cloned
 
-        def add(items):
-            for item in items:
-                if item is self:
-                    raise exc.InvalidRequestError(
-                        "select() construct refers to itself as a FROM")
-                if translate and item in translate:
-                    item = translate[item]
-                if not seen.intersection(item._cloned_set):
-                    froms.append(item)
-                seen.update(item._cloned_set)
-
-        add(_from_objects(*self._raw_columns))
-        if self._whereclause is not None:
-            add(_from_objects(self._whereclause))
-        add(self._from_obj)
+        for item in itertools.chain(
+            _from_objects(*self._raw_columns),
+            _from_objects(self._whereclause)
+            if self._whereclause is not None else (),
+            self._from_obj
+        ):
+            if item is self:
+                raise exc.InvalidRequestError(
+                    "select() construct refers to itself as a FROM")
+            if translate and item in translate:
+                item = translate[item]
+            if not seen.intersection(item._cloned_set):
+                froms.append(item)
+            seen.update(item._cloned_set)
 
         return froms