如何從 gorm 獲取當前模式?通常它是“SHOW search_path”并且是一個 exec。與通常設置當前 search_path 相同“將 search_path 設置為 newschema”。其中新模式可以是一系列名稱中的單個模式名稱。我嘗試了 db.Exec("show search_path").Find(&result),其中結果是一個 []string,我得到一個空數組。
查看完整描述
TA貢獻1862條經驗 獲得超6個贊
search_path
通過執行查詢來設置set search_path to newschema
是不正確的設置方式,因為這只會對用于執行查詢的連接進行更改。
要將其設置為您的應用程序將使用的完整連接集,您需要將其search_path
作為參數提供給gorm.Open("postgres", "dbname=YourDB search_path=YourSearchPath")
您將要使用的所有其他連接參數,例如dbname
or port
,user
等等。
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(¤tSchema) 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 架構來分隔我的應用程序中的設施,并且需要根據登錄的用戶進行更改。所有用戶和設施信息都是公開的。
舉報