【问题标题】:"set session" in a SQLAlchemy session objectSQLAlchemy 会话对象中的“设置会话”
【发布时间】:2013-08-26 21:25:07
【问题描述】:

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

set session max_heap_table_size = 1024 * 1024 * 64;

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

【问题讨论】:

    标签: python mysql sqlalchemy


    【解决方案1】:

    使用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 事件来包装它,因此可能会产生问题。

    【讨论】:

    • 谢谢! after_begin() 会是最好的回调吗?您是否有机会提供有关我将如何执行此操作的代码示例?
    • @Suman 看到我的编辑。 after_begin 是个好主意,但正如我所指出的,如果您需要在最后重置设置,这可能会导致问题。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      以上都不适合我。 但这有效:

      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')
      

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

      【讨论】:

      • 很高兴,但你能告诉我哪个部分需要更多细节吗?
      猜你喜欢
      • 1970-01-01
      • 2014-04-22
      • 2014-02-06
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      相关资源
      最近更新 更多