НАЙДЕНО, как отображать текущую схему, экспериментируя, и подсказку о Raw и Scan в классе GORM PluralSite.
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.Begin ()
tx.Exec ("set search_path to schema_name")
Строка генерируется для использования правильного имени схемы Facility.
Tx - это последний параметр в сигнатуре всех методов, которые касаются БД.Например, func methiodUsingDBSchema (строка val1, строка val2, tx * gorm.DB) {}
Тогда последнее, что я делаю, это tx.Commit () Даже если все они читаются.
Я провел все тесты и работает хорошо.
Я использую схемы Postgres для разделения Услуг в моем приложении, и мне необходимо изменить их в зависимости от того, какой пользователь вошел в систему. Вся информация о Пользователе и Услугах является общедоступной.