【问题标题】:Set PostgreSQL configuration parameter in SQLAlchemy在 SQLAlchemy 中设置 PostgreSQL 配置参数
【发布时间】:2014-12-02 00:18:33
【问题描述】:

我正在为我的 REST 服务器使用 Pyramid 和 SQLAlchemy。出于日志记录的目的,我需要一些方法来在更新触发函数后确定 postgresql 中的用户名。一种方法是在更新执行之前设置一些运行时配置参数并在触发函数中使用该值。

在 psql 终端可以使用

set myapp.user_name = 'User Name';

这个参数后续会在postgresql触发器中使用。

是否可以在 Pyramid / SQLAlchemy 应用程序中设置此参数? 我想我可以使用 SQLAlchemy 事件。但我不确定哪个事件对于这种情况是正确的。

【问题讨论】:

    标签: postgresql sqlalchemy pyramid


    【解决方案1】:

    您可以注册一个 Pyramid 事件处理程序,它将在任何新请求上设置参数:

    from pyramid import events
    
    def on_new_request(event):
        """
        you can access request as event.request 
        and the current registry settings as event.request.registry.settings
        """
        session = DBSession()
        session.execute("SET blah TO 'foo'")
    
    
    def app(global_config, **settings):
    
        config = Configurator(...)
        config.add_subscriber(on_new_request, events.NewRequest)
    

    请参阅Deployment Settings 和events.NewRequest 了解更多详情。

    要注意的一件事是确保您始终使用相同的会话对象 - SQLAlchemy 维护一个连接池,如果您提交会话,所有后续操作都将使用一个全新的会话,而不是预先- 使用您的设置进行配置。换句话说,您不应在代码中执行 session.commit()、session.rollback()、transaction.commit() 等,而应依赖 ZopeTransactionExtension 在请求/响应周期结束时提交/回滚事务.无论如何,这是推荐的做法。

    【讨论】:

    • 这正是我所需要的。谢谢。我正在使用 ZopeTransactionExtension。没有 commit(),在某些情况下我只调用 session.flush()。
    • 是的,谢尔盖是正确的,这种模式会很好用。我个人更喜欢使用订阅者语法:@subscriber(NewResponse)docs.pylonsproject.org/projects/pyramid/en/latest/narr/…
    【解决方案2】:

    我不确定您使用set myapp.user = "User Name" 运行的确切命令是什么。

    当您说“在 psql 中可以使用...完成此操作”时,我假设您正在运行某种 SQL 命令,尽管您列出的命令不是有效命令,至少通常不是。

    在任何情况下,都可以在 SQLAlchemy 中使用.execute() 方法执行任意 SQL。

    session = Session()
    session.execute("select 1;")
    

    http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html?highlight=execute#sqlalchemy.orm.session.Session.execute

    【讨论】:

    • 然后你从 PSQL 提示符运行它? => set myapp.user_name = 'User Name'; ?是这个意思吗?
    • 是的。我需要一些方法来确定 postgresql 触发器函数中的用户名。一种方法是在更新语句之前设置一些配置参数,并在更新后触发函数中使用此值。
    • 如果您只需要执行该命令,我的答案将执行此操作,我不确定您到底想做什么...您能否澄清一下它是否不仅仅是运行该命令?
    • 是的,我只需要执行那个命令。我正在我的 Pyramid 应用程序中找到合适的位置。或许可以在登录成功后以金字塔登录视图的方式进行。
    • 您是否需要每个用户会话或每个请求一次?我建议每个请求添加一个补间来自动为你处理它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    相关资源
    最近更新 更多