5

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

set session max_heap_table_size = 1024 * 1024 * 64;

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

4

3 回答 3

4

使用会话事件对每个新事务执行任意 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事件来包装它,因此它可能会产生问题。

于 2013-08-23T18:38:37.907 回答
1

我最终这样做是为了让它工作:

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

SQLAlchemy 事件似乎不起作用,但话又说回来,我可能做得不完全正确。

于 2013-08-30T17:27:48.083 回答
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')

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

于 2020-11-26T10:12:41.600 回答