2015-10-02 4 views
2

С точки зрения пользователя, ведение журнала запросов SQLAlchemy кажется слишком громоздким и даже несколько загадочно временами:дружественный каротаж запрос в SQLAlchemy

2015-10-02 13:51:39,500 INFO sqlalchemy.engine.base.Engine BEGIN (implicit) 
2015-10-02 13:51:39,502 INFO sqlalchemy.engine.base.Engine SELECT anon_1.shelves_title AS anon_1_shelves_title, ..., anon_1.shelves_created_at AS anon_1_shelves_created_at, anon_1.shelves_updated_at AS anon_1_shelves_updated_at, products_1.id AS products_1_id, products_1.title AS products_1_title 
FROM (SELECT shelves.title AS shelves_title, ..., shelves.created_at AS shelves_created_at, shelves.updated_at AS shelves_updated_at 
FROM shelves 
WHERE shelves.title = ? 
LIMIT ? OFFSET ?) AS anon_1 LEFT OUTER JOIN products AS products_1 ON anon_1.shelves_title = products_1.shelf_title 
2015-10-02 13:51:39,502 INFO sqlalchemy.engine.base.Engine ('sample', 1, 0) 
2015-10-02 13:51:39,503 INFO sqlalchemy.engine.base.Engine ROLLBACK 

(не обязательно представитель, но, надеюсь, достаточно, чтобы проиллюстрировать этот вопрос)

Возможно Рубин на Rails является хорошим справочным здесь, обеспечивая краткую и раскрашивают вывод реальных запросов к базе данных:

Rails SQL logging

(via https://code.google.com/p/pylonsquerybar/#What_Others_Have_Done)

Есть ли простой способ получить аналогичный вывод для SQLAlchemy? (. Вышеупомянутый Пилоны Query Bar не кажется, предназначен для рамочного агностик повторного использования)

ответ

1

Вы можете установить любой формат для регистратора, вы можете получить регистратор:

import logging 
logging.basicConfig(filename='db.log') 
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO) 

как установить цвет и формат см. здесь:
How can I color Python logging output?

+0

Я боюсь, что это на самом деле не касается основной проблемы форматирования фактических SQL-запросов, устранения шума и упрощения понимания структуры. – AnC

+0

Что такое «шум»?
2015-10-02 13: 51: 39 503 INFO sqlalchemy.engine.base.Engine ROLLBACK
2015-10-02 13: 51: 39,500 INFO sqlalchemy.engine.base.Engine BEGIN (неявный)? – kain64b

+0

Да; почти все, что не является фактическим SQL-запросом. В идеале этот запрос также должен отображаться точно так же, как он отправляется в базу данных. – AnC

0

FWIW, ниже, что мы придумали. Он добавляет чередующуюся раскраску, которая не решает проблему шума, но по крайней мере обеспечивает визуальное различие.

import logging 

import colorama 


def configure_sql_logging(): 
    sqla_logger = logging.getLogger("sqlalchemy.engine.base.Engine") 
    sqla_logger.propagate = False 
    sqla_logger.addHandler(SQLLogger(colors=["MAGENTA", "CYAN"])) 


class SQLLogger(logging.StreamHandler): 

    def __init__(self, *args, colors, **kwargs): 
     super().__init__(*args, **kwargs) 
     self.colors = colors 
     self.colorizer = Colorizer(self.stream, colors[0]) 

    def emit(self, *args, **kwargs): 
     with self.colorizer: 
      super().emit(*args, **kwargs) 

     # cycle colors 
     if self.colorizer.active: 
      self.colors.append(self.colors.pop(0)) 
      self.colorizer.color = self.colors[0] 


class Colorizer: 

    def __init__(self, stream, color): 
     self.stream = stream 
     self.active = stream.isatty() 
     if self.active: 
      colorama.init() 
      self.color = color 

    def __enter__(self): 
     if self.active: 
      self.stream.write(getattr(colorama.Fore, self.color)) 

    def __exit__(self, type, value, traceback): 
     if self.active: 
      self.stream.write(colorama.Fore.RESET) 
Смежные вопросы