我正在将SQLAlchemy用于项目,并且出于性能原因需要能够为一个特定的调用指定会话变量/设置:
set session max_heap_table_size = 1024 * 1024 * 64;
我当然可以直接在MySQL中(在shell上)执行此操作,但是如何在SQLAlchemy会话中设置此会话变量?
答案 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')
这必须在执行查询之前发生。