我使用 Pyramid 和 SQLAlchemy 作为我的REST服务器。为了记录日志,我需要一些方法来确定更新触发器函数后postgresql中的用户名。一种方法是在更新执行之前设置一些运行时配置参数,并在触发函数中使用此值。
在 psql 终端中,可以使用
完成set myapp.user_name = 'User Name';
此参数随后将在postgresql触发器中使用。
是否可以在 Pyramid / SQLAlchemy 应用程序中设置此参数? 我想我可以使用 SQLAlchemy 事件。但我不确定哪个事件对于这种情况是正确的。
答案 0 :(得分:1)
我不确定您使用set myapp.user = "User Name"
运行的确切命令是什么。
当你说"在psql中,这可以使用..."我假设您正在运行某种SQL命令,尽管您列出的命令不是有效命令,至少通常不是。
无论如何,可以使用.execute()
方法在SQLAlchemy中执行任意SQL。
session = Session()
session.execute("select 1;")
答案 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 Settings和events.NewRequest。
要注意的一件事是确保您始终使用相同的会话对象 - SQLAlchemy维护一个连接池,如果您提交会话,所有后续操作将使用一个全新的会话 - 配置您的设置。换句话说,您不应该在代码中执行session.commit(),session.rollback(),transaction.commit()等,而是依赖于ZopeTransactionExtension在请求/响应周期结束时提交/回滚事务。无论如何,这是推荐的做法。