在SQLAlchemy中设置PostgreSQL配置参数

时间:2014-10-07 14:21:22

标签: postgresql sqlalchemy pyramid

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

psql 终端中,可以使用

完成
set myapp.user_name = 'User Name';

此参数随后将在postgresql触发器中使用。

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

2 个答案:

答案 0 :(得分:1)

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

当你说"在psql中,这可以使用..."我假设您正在运行某种SQL命令,尽管您列出的命令不是有效命令,至少通常不是。

无论如何,可以使用.execute()方法在SQLAlchemy中执行任意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

答案 1 :(得分: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 Settingsevents.NewRequest

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