Commits

Mike Bayer committed 7859f37

- Fixed bug whereby mapper mapped to an anonymous
alias would fail if logging were used, due to
unescaped % sign in the alias name. [ticket:2171]
Also in 0.6.8.

  • Participants
  • Parent commits 9b3bd06

Comments (0)

Files changed (3)

     unions in which they appear.  (which is itself 
     an unordered mapping unless you pass an OrderedDict).
 
+  - Fixed bug whereby mapper mapped to an anonymous
+    alias would fail if logging were used, due to 
+    unescaped % sign in the alias name.  [ticket:2171]
+    Also in 0.6.8.
+
 - sql
   - Fixed bug whereby nesting a label of a select()
     with another label in it would produce incorrect

File lib/sqlalchemy/orm/mapper.py

         for mapper in self.iterate_to_root():
             _memoized_configured_property.expire_instance(mapper)
 
-    def _log(self, msg, *args):
-        self.logger.info(
-            "(" + self.class_.__name__ + 
-            "|" + 
+    @property
+    def _log_desc(self):
+        return "(" + self.class_.__name__ + \
+            "|" + \
             (self.local_table is not None and 
                 self.local_table.description or 
-                str(self.local_table)) +
-            (self.non_primary and "|non-primary" or "") + ") " + 
-            msg, *args)
+                str(self.local_table)) +\
+            (self.non_primary and 
+            "|non-primary" or "") + ")"
+
+    def _log(self, msg, *args):
+
+        self.logger.info(
+            "%s " + msg, *((self._log_desc,) + args)
+        )
 
     def _log_debug(self, msg, *args):
         self.logger.debug(
-            "(" + self.class_.__name__ + 
-            "|" + 
-            (self.local_table is not None and 
-                self.local_table.description 
-                or str(self.local_table)) + 
-            (self.non_primary and "|non-primary" or "") + ") " + 
-            msg, *args)
+            "%s " + msg, *((self._log_desc,) + args)
+        )
 
     def __repr__(self):
         return '<Mapper at 0x%x; %s>' % (

File test/orm/test_mapper.py

 from test.lib import fixtures
 from test.orm import _fixtures
 from test.lib.assertsql import CompiledSQL
+import logging
 
 class MapperTest(_fixtures.FixtureTest):
 
         eq_(Bar.col1.__doc__, "primary key column")
         eq_(Bar.foo.__doc__, "foo relationship")
 
-
+class ORMLoggingTest(_fixtures.FixtureTest):
+    def setup(self):
+        self.buf = logging.handlers.BufferingHandler(100)
+        for log in [
+            logging.getLogger('sqlalchemy.orm'),
+        ]:
+            log.addHandler(self.buf)
+            log.setLevel(logging.DEBUG)
+
+    def teardown(self):
+        for log in [
+            logging.getLogger('sqlalchemy.orm'),
+        ]:
+            log.removeHandler(self.buf)
+
+    def _current_messages(self):
+        return [b.getMessage() for b in self.buf.buffer]
+
+    def test_mapper_info_aliased(self):
+        User, users = self.classes.User, self.tables.users
+        tb = users.select().alias()
+        mapper(User, tb)
+        s = Session()
+        s.add(User(name='ed'))
+        s.commit()
+
+        for msg in self._current_messages():
+            assert msg.startswith('(User|%%(%d anon)s) ' % id(tb))
 
 class OptionsTest(_fixtures.FixtureTest):