2 回答

TA貢獻1862條經(jīng)驗 獲得超6個贊
search_path
通過執(zhí)行查詢來設(shè)置set search_path to newschema
是不正確的設(shè)置方式,因為這只會對用于執(zhí)行查詢的連接進行更改。
要將其設(shè)置為您的應(yīng)用程序?qū)⑹褂玫耐暾B接集,您需要將其search_path
作為參數(shù)提供給gorm.Open("postgres", "dbname=YourDB search_path=YourSearchPath")
您將要使用的所有其他連接參數(shù),例如dbname
or port
,user
等等。

TA貢獻1847條經(jīng)驗 獲得超11個贊
在 PluralSite 的 GORM 類中找到了如何通過實驗和有關(guān) Raw 和 Scan 的提示來顯示當(dāng)前模式。
var currentSchema string rows, err := db.Debug().Raw("show search_path").Rows() rows.Next() // to get the first and only result rows.Scan(¤tSchema) fmt.Printf("Search Path: %v\n", currentSchema)
返回:搜索路徑:“$user”,public
考慮到@PavloStrokov 關(guān)于事務(wù)(基本上是線程和事務(wù))的觀點,我能夠讓模式保留在當(dāng)前進程中。在處理程序中,我使用現(xiàn)有的數(shù)據(jù)庫連接并創(chuàng)建一個事務(wù)。它被傳遞給每個被調(diào)用的接觸數(shù)據(jù)庫的方法。我將對 gorm 方法的調(diào)用更改為傳遞的 tx 而不是存儲并可供任何需要它的方法使用的普通 db 變量。
我為啟動這一切所做的呼吁是:
tx := db.開始()
tx.Exec("將 search_path 設(shè)置為 schema_name")
生成字符串以使用正確的 Facility 模式名稱。
tx 是所有接觸數(shù)據(jù)庫的方法簽名中的最后一個參數(shù)。例如 func methiodUsingDBSchema(val1 string, val2 string, tx *gorm.DB){}
然后我做的最后一件事是 tx.Commit() 即使這些都是讀取。
我已經(jīng)運行了所有測試并且運行良好。
我使用 Postgres 架構(gòu)來分隔我的應(yīng)用程序中的設(shè)施,并且需要根據(jù)登錄的用戶進行更改。所有用戶和設(shè)施信息都是公開的。
- 2 回答
- 0 關(guān)注
- 301 瀏覽
添加回答
舉報