亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Postgres模式的SQLAlchemy支持

Postgres模式的SQLAlchemy支持

有只小跳蛙 2019-12-25 15:57:04
我們使用SQLAlchemy和postgres托管一個多租戶應用程序。我正在考慮從為每個租戶使用單獨的數據庫遷移到具有多個架構的單個數據庫。SQLAlchemy是否原生支持此功能?我基本上只是希望每個查詢都以預定的模式作為前綴...例如select * from client1.users而不只是select * from users請注意,我想為特定請求/一組請求中的所有表切換架構,而不僅僅是在這里和那里的單個表。我想這也可以通過自定義查詢類來完成,但是我無法想象在這方面還沒有做任何事情。
查看完整描述

3 回答

?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

如果要在連接字符串級別執行此操作,請使用以下命令:


dbschema='schema1,schema2,public' # Searches left-to-right

engine = create_engine(

    'postgresql+psycopg2://dbuser@dbhost:5432/dbname',

    connect_args={'options': '-csearch_path={}'.format(dbschema)})

但是,對于多客戶端(多租戶)應用程序,更好的解決方案是為每個客戶端配置一個不同的db用戶,并為每個用戶配置相關的search_path:


alter role user1 set search_path = "$user", public


查看完整回答
反對 回復 2019-12-25
?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

您可能可以使用sqlalchemy事件界面進行管理。因此,在創建第一個連接之前,請按照以下步驟設置一個偵聽器:


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 )

顯然,這需要在創建第一個連接之前執行(例如,在應用程序初始化中)


我在session.execute(...)解決方案中看到的問題是,它在會話使用的特定連接上執行。但是,我在sqlalchemy中看不到任何可以保證會話將無限期繼續使用相同連接的東西。如果它從連接池中拾取新連接,則它將丟失搜索路徑設置。


我需要這樣一種方法來設置應用程序search_path,它與數據庫或用戶搜索路徑不同。我希望能夠在引擎配置中進行設置,但是看不到一種實現方法。使用connect事件確實有效。如果有人有一個更簡單的解決方案,我將感興趣。


另一方面,如果您想在一個應用程序中處理多個客戶端,則此方法將不起作用-我猜session.execute(...)方法可能是最好的方法。


查看完整回答
反對 回復 2019-12-25
  • 3 回答
  • 0 關注
  • 1146 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號