使用GORM和Postgresql如何设置search_path?

时间:2019-05-29 19:10:16

标签: postgresql go gorm

如何从gorm获取当前模式?通常,它是“ SHOW search_path”,是一个执行程序。与通常将当前search_path设置为“将search_path设置为newschema”相同。新模式可以是一系列名称中的单个模式名称。

我尝试了db.Exec(“ show search_path”)。Find(&result),其中结果是[]字符串,但我得到了一个空数组。

2 个答案:

答案 0 :(得分:0)

在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”,公开

考虑到@PavloStrokov关于事务(基本上是线程和事务)的观点,我能够使架构在当前过程中保持不变。在处理程序中,我使用现有的数据库连接并创建一个事务。它被传递给每个与数据库有关的方法。我将对gorm方法的调用更改为传递的tx,而不是存储并提供给需要它的任何方法使用的常规db变量。

我要开始的全部呼叫是:

tx:= db.Begin()

tx.Exec(“将search_path设置为schema_name”)

生成该字符串以使用适当的设施架构名称。

tx是所有接触DB方法的签名中的最后一个参数。例如func methiodUsingDBSchema(val1 string,val2 string,tx * gorm.DB){}

然后我要做的最后一件事是tx.Commit(),即使这些都是读取的。

我已经进行了所有测试,并且运行良好。

我使用Postgres模式在应用程序中分隔设施,并且需要根据登录的用户进行更改。所有用户和设施信息都是公开的。

答案 1 :(得分:0)

通过执行类似search_path的查询来设置set search_path to newschema是错误的设置方式,因为该设置只会更改用于执行查询的连接。

要将其设置为应用程序要使用的完整连接,您需要提供search_path作为gorm.Open("postgres", "dbname=YourDB search_path=YourSearchPath")的参数以及您将要使用的所有其他连接参数,例如dbnameportuser