2014-10-07 564 views
1

我正在使用金字塔SQLAlchemy用於我的REST服務器。對於日誌記錄的目的,我需要一些方法來更新觸發器函數後如何確定postgresql中的用戶名。一種方法是在更新執行前設置一些運行時配置參數,並在觸發函數中使用此值。在SQLAlchemy中設置PostgreSQL配置參數

PSQL終端它可以使用

set myapp.user_name = 'User Name'; 

該參數將在PostgreSQL觸發隨後用於進行。

是否有可能設置金字塔/SQLAlchemy的應用這個參數? 我想我可以使用SQLAlchemy事件。但我不確定哪個事件對於這種情況是正確的。

回答

1

您可以註冊一個金字塔的事件處理程序將其上設置任何新的請求參數:

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在請求/響應週期結束時提交/回滾事務。無論如何,這是一個推薦的做法。

+0

這正是我所需要的。謝謝。我正在使用ZopeTransactionExtension。沒有提交(),在某些情況下,只有我調用session.flush()。 – 2014-10-08 07:20:26

+0

是的,謝爾蓋是正確的,這種模式將工作得很好。我更願意親自使用訂戶語法:'@subscriber(NewResponse)'http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/hooks.html#subscriber-predicates – Jason 2014-10-08 12:45:52

+0

您可以將答案標記爲然後接受 – Sergey 2014-10-08 19:10:20

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

+0

對不起,正確的命令是設置myapp.user_name ='用戶名'; – 2014-10-07 14:56:01

+0

然後從PSQL提示符運行它? '=>設置myapp.user_name ='用戶名';'?你是這個意思嗎? – Jason 2014-10-07 15:48:04

+0

是的。我需要一些方法來確定postgresql觸發器函數中的用戶名。一種方法是在更新語句之前設置一些配置參數,並在更新觸發器函數之後使用此值。 – 2014-10-07 15:59:45