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

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

使用 GORM 和 Postgresql 如何設置搜索路徑?

使用 GORM 和 Postgresql 如何設置搜索路徑?

Go
倚天杖 2023-06-19 17:13:46
如何從 gorm 獲取當前模式?通常它是“SHOW search_path”并且是一個 exec。與通常設置當前 search_path 相同“將 search_path 設置為 newschema”。其中新模式可以是一系列名稱中的單個模式名稱。我嘗試了 db.Exec("show search_path").Find(&result),其中結果是一個 []string,我得到一個空數組。
查看完整描述

2 回答

?
阿波羅的戰車

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

search_path通過執行查詢來設置set search_path to newschema是不正確的設置方式,因為這只會對用于執行查詢的連接進行更改。

要將其設置為您的應用程序將使用的完整連接集,您需要將其search_path作為參數提供給gorm.Open("postgres", "dbname=YourDB search_path=YourSearchPath")您將要使用的所有其他連接參數,例如dbnameor port,user等等。


查看完整回答
反對 回復 2023-06-19
?
回首憶惘然

TA貢獻1847條經驗 獲得超11個贊

在 PluralSite 的 GORM 類中找到了如何通過實驗和有關 Raw 和 Scan 的提示來顯示當前模式。

var currentSchema string
rows, err := db.Debug().Raw("show search_path").Rows()
rows.Next()  // to get the first and only result
rows.Scan(&currentSchema)
fmt.Printf("Search Path: %v\n", currentSchema)

返回:搜索路徑:“$user”,public

考慮到@PavloStrokov 關于事務(基本上是線程和事務)的觀點,我能夠讓模式保留在當前進程中。在處理程序中,我使用現有的數據庫連接并創建一個事務。它被傳遞給每個被調用的接觸數據庫的方法。我將對 gorm 方法的調用更改為傳遞的 tx 而不是存儲并可供任何需要它的方法使用的普通 db 變量。

我為啟動這一切所做的呼吁是:

tx := db.開始()

tx.Exec("將 search_path 設置為 schema_name")

生成字符串以使用正確的 Facility 模式名稱。

tx 是所有接觸數據庫的方法簽名中的最后一個參數。例如 func methiodUsingDBSchema(val1 string, val2 string, tx *gorm.DB){}

然后我做的最后一件事是 tx.Commit() 即使這些都是讀取。

我已經運行了所有測試并且運行良好。

我使用 Postgres 架構來分隔我的應用程序中的設施,并且需要根據登錄的用戶進行更改。所有用戶和設施信息都是公開的。


查看完整回答
反對 回復 2023-06-19
  • 2 回答
  • 0 關注
  • 287 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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