3 回答

TA貢獻(xiàn)1813條經(jīng)驗(yàn) 獲得超2個贊
如果要在連接字符串級別執(zhí)行此操作,請使用以下命令:
dbschema='schema1,schema2,public' # Searches left-to-right
engine = create_engine(
'postgresql+psycopg2://dbuser@dbhost:5432/dbname',
connect_args={'options': '-csearch_path={}'.format(dbschema)})
但是,對于多客戶端(多租戶)應(yīng)用程序,更好的解決方案是為每個客戶端配置一個不同的db用戶,并為每個用戶配置相關(guān)的search_path:
alter role user1 set search_path = "$user", public

TA貢獻(xiàn)1998條經(jīng)驗(yàn) 獲得超6個贊
您可能可以使用sqlalchemy事件界面進(jìn)行管理。因此,在創(chuàng)建第一個連接之前,請按照以下步驟設(shè)置一個偵聽器:
from sqlalchemy import event
from sqlalchemy.pool import Pool
def set_search_path( db_conn, conn_proxy ):
print "Setting search path..."
db_conn.cursor().execute('set search_path=client9, public')
event.listen(Pool,'connect', set_search_path )
顯然,這需要在創(chuàng)建第一個連接之前執(zhí)行(例如,在應(yīng)用程序初始化中)
我在session.execute(...)解決方案中看到的問題是,它在會話使用的特定連接上執(zhí)行。但是,我在sqlalchemy中看不到任何可以保證會話將無限期繼續(xù)使用相同連接的東西。如果它從連接池中拾取新連接,則它將丟失搜索路徑設(shè)置。
我需要這樣一種方法來設(shè)置應(yīng)用程序search_path,它與數(shù)據(jù)庫或用戶搜索路徑不同。我希望能夠在引擎配置中進(jìn)行設(shè)置,但是看不到一種實(shí)現(xiàn)方法。使用connect事件確實(shí)有效。如果有人有一個更簡單的解決方案,我將感興趣。
另一方面,如果您想在一個應(yīng)用程序中處理多個客戶端,則此方法將不起作用-我猜session.execute(...)方法可能是最好的方法。
添加回答
舉報