]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed bug whereby mapper mapped to an anonymous
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 20 May 2011 18:43:06 +0000 (14:43 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 20 May 2011 18:43:06 +0000 (14:43 -0400)
alias would fail if logging were used, due to
unescaped % sign in the alias name.  [ticket:2171]
Also in 0.6.8.

CHANGES
lib/sqlalchemy/orm/mapper.py
test/orm/test_mapper.py

diff --git a/CHANGES b/CHANGES
index 3f67598e1910297775a249d4dd7b3222c00634f1..a8ea3423388e00212f659e7beb9fcf71dfb89e52 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -87,6 +87,11 @@ CHANGES
     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
index 53f8af0b4e67d9cfe2c22f6dba095d0a5dc233dd..a426e28ac2e9ce4b2221c9ad5128836d85dfae09 100644 (file)
@@ -1066,25 +1066,26 @@ class Mapper(object):
         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>' % (
index 604c92f4177b56c0bf683968176bf6ebe87eae16..f292f5e73f81236cc1ec7fe6e0dedd7dea4db0bc 100644 (file)
@@ -15,6 +15,7 @@ from test.lib.testing import eq_, AssertsCompiledSQL
 from test.lib import fixtures
 from test.orm import _fixtures
 from test.lib.assertsql import CompiledSQL
+import logging
 
 class MapperTest(_fixtures.FixtureTest):
 
@@ -1410,7 +1411,34 @@ class DocumentTest(fixtures.TestBase):
         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):