From aa5ca4af5b48dbf0080998f3e5aa837ff31b5ef9 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Fri, 20 May 2011 14:45:20 -0400 Subject: [PATCH] - 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] --- CHANGES | 4 ++++ lib/sqlalchemy/orm/mapper.py | 29 +++++++++++++++-------------- test/orm/test_mapper.py | 29 ++++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 15 deletions(-) diff --git a/CHANGES b/CHANGES index 801741f25f..bbf39408aa 100644 --- a/CHANGES +++ b/CHANGES @@ -46,6 +46,10 @@ CHANGES how join() itself determines an FK error. [ticket:2153] + - 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] + - sql - Fixed bug whereby if FetchedValue was passed to column server_onupdate, it would not diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index e9caa6da59..de0023ddf7 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -876,25 +876,26 @@ class Mapper(object): for mapper in self.iterate_to_root(): _memoized_compiled_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 '' % ( diff --git a/test/orm/test_mapper.py b/test/orm/test_mapper.py index 4c82bc50b7..fa8bd70f04 100644 --- a/test/orm/test_mapper.py +++ b/test/orm/test_mapper.py @@ -15,7 +15,7 @@ from sqlalchemy.orm import defer, deferred, synonym, attributes, \ from sqlalchemy.test.testing import eq_, AssertsCompiledSQL from test.orm import _base, _fixtures from sqlalchemy.test.assertsql import AllOf, CompiledSQL - +import logging class MapperTest(_fixtures.FixtureTest): @@ -1281,7 +1281,34 @@ class DocumentTest(testing.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): -- 2.47.3