Используя GORM и Postgresql, как установить search_path? - PullRequest
0 голосов
/ 29 мая 2019

Как я могу получить текущую схему из gorm?Обычно это "SHOW search_path" и является exec.То же самое с установкой текущего search_path обычно "установить search_path в newschema".где новая схема может быть одним именем схемы из серии имен.

Я попытался db.Exec ("show search_path"). Найти (& result), где result - строка [], и я получаю пустой массив,

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Установка search_path путем выполнения запроса, например set search_path to newschema, является неправильным способом установки, поскольку он будет изменен только для соединения, которое использовалось для выполнения запроса.

Чтобы установить для него полный набор соединений, которые будет использовать ваше приложение, вам необходимо предоставить search_path в качестве аргумента для gorm.Open("postgres", "dbname=YourDB search_path=YourSearchPath") со всеми другими аргументами соединения, которые вы собираетесь использовать, например dbname или port, user и т. д.

0 голосов
/ 29 мая 2019

НАЙДЕНО, как отображать текущую схему, экспериментируя, и подсказку о 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(&currentSchema)
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 для разделения Услуг в моем приложении, и мне необходимо изменить их в зависимости от того, какой пользователь вошел в систему. Вся информация о Пользователе и Услугах является общедоступной.

...