2013-08-23 3 views
2

Я использую SQLAlchemy для проекта, и должен быть в состоянии определить переменный сеанс/настроек для одного конкретного вызова для увеличения производительности:«установить сеанс» в объекте SQLAlchemy сессии

set session max_heap_table_size = 1024 * 1024 * 64; 

я могу конечно, делайте это в MySQL напрямую (в оболочке), но как установить эту переменную сеанса в сеансе SQLAlchemy?

ответ

3

Используйте команду session event для выполнения произвольной инструкции SQL для каждой новой транзакции. Вы также можете использовать события на уровне соединения, это зависит от вашего варианта использования.

Вот как я хотел бы сделать это на уровне сеанса:

Session = sessionmaker() 
@event.listens_for(Session, 'before_flush') 
def set_max_heap_table_size(session, transaction, connection): 
    session.execute('SET max_heap_table_size = 1024 * 1024 * 64') 

Если вы не уверены, какой способ работает для вас, просто попробовать их, написать несколько тестов и выяснить, если это работает для вас.

Возможно, существует одно предостережение (unsure): поскольку соединение не отбрасывается, но возвращается в пул, настройка может сохраняться. В этом случае вы также можете прикрепить что-то, чтобы восстановить значение по умолчанию, например. на мероприятии after_flush. Я не совсем уверен в этом, вы можете экспериментировать. Если это не нужно, вы также можете использовать событие after_begin, но нет реального события before_close, который его обертывает, поэтому он может создавать проблемы.

+0

Спасибо! Будет ли after_begin() быть лучшим обратным вызовом для этого? Есть ли вероятность, что вы можете привести пример кода о том, как я буду это делать? – Suman

+0

@Suman см. Мое редактирование. 'after_begin' - хорошая идея, но, как я уже сказал, это может вызвать проблемы, если вам нужно сбросить настройки в конце. – javex

1

я, наконец, в конечном итоге делает это, чтобы заставить его работать:

Session = sessionmaker() 
... 
session.connection().execute('SET max_heap_table_size = 1024 * 1024 * 64'); 

Событие SQLAlchemy, похоже, не работает, но опять же, его возможно, я делал это не совсем верно.

Смежные вопросы