Here's what I'd like to do. Suppose I have some class Foo in
some_module.py:
class Foo(Entity):
def all_foos(self):
return self.session.query(Foo).all()
...sqlalchemy by default will log this to sqlalchemy.engine. However,
this makes it a bit difficult to narrow down what query is coming from
where. What I would like to have happen is that this is logged to the
name some_module.Foo (or some_other_module.Bar if it comes from a
different class).
The best approach that I've come up with involves a query option and a
decorator:
class LoggerOption(MapperOption):
"""
This is an option that may be passed in to sqlalchemy's
Query.options. This will make the query be logged to
any arbitrary namespace. Example::
session.query(Mbr).options(LoggerOption('foo')
The above query will be logged on the logger returned
by logging.getLogger('foo').
"""
def __init__(self, name):
self.name = name
propagate_to_loaders = True
def process_query(self, query):
logger = logging.getLogger(self.name)
statement = query.statement
logger.debug(str(statement))
logger.debug(str(statement.compile().params))
def query(attr_name):
def _query(func):
def _run_query(self, *args, **kwargs):
query = func(self, *args, **kwargs)
query =
query.options(LoggerOption(self.__class__.__module__ + '.' +
self.__class__.__name__))
attr = getattr(query, attr_name)
return attr()
_run_query.__doc__ = func.__doc__
return _run_query
return _query
...so I could rewrite Foo like this:
class Foo(Entity):
@query('all')
def all_foos(self):
return self.session.query(Foo)
This works, but it feels like there should be a better way than having
to attach a decorator to every method and having to return a query
from that method. Is there any better way to do this?
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.