SQLAlchemy会话对象中的“set session”

时间:2013-08-23 18:21:18

标签: python mysql sqlalchemy

我正在将SQLAlchemy用于项目,并且出于性能原因需要能够为一个特定的调用指定会话变量/设置:

set session max_heap_table_size = 1024 * 1024 * 64;

我当然可以直接在MySQL中(在shell上)执行此操作,但是如何在SQLAlchemy会话中设置此会话变量?

3 个答案:

答案 0 :(得分: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')

如果您不确定哪种方式适合您,请尝试它们,编写一些测试用例并找出是否适用于您。

可能有一点需要注意(不确定):由于连接未被删除但返回到池中,因此设置可能会持续存在。在这种情况下,您可能还想附加一些内容来恢复默认值,例如在after_flush事件上。我不完全确定这个,你可能想试验一下。如果没有必要,您也可以使用after_begin事件,但没有包含它的真正before_close事件,因此可能会产生问题。

答案 1 :(得分:1)

我最终为此付出了努力:

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

SQLAlchemy事件似乎不起作用,但是再一次,它可能我没有完全正确。

答案 2 :(得分:0)

以上都不对我有用。 但这有效:

engine_type: str = 'mysql+mysqlconnector'
db_user_name: str = '<some-user-name>'
db_user_password: str = '<some-user-psswd>'
db_server: str = '<db-server>'
db_name: str = '<database>'
engine: sqlalchemy.engine.Engine = create_engine(
   f'{engine_type}://{db_user_name}:{db_user_password}@{db_server}:3306/{db_name}'
)
engine.execute("SHOW VARIABLES like 'group_concat_max_len'").fetchone()
('group_concat_max_len', '1024')
engine.execute("SET SESSION group_concat_max_len=10240")
engine.execute("SHOW VARIABLES like 'group_concat_max_len'").fetchone()
('group_concat_max_len', '10240')

这必须在执行查询之前发生。