如何从gorm获取当前模式?通常,它是“ SHOW search_path”,是一个执行程序。与通常将当前search_path设置为“将search_path设置为newschema”相同。新模式可以是一系列名称中的单个模式名称。
我尝试了db.Exec(“ show search_path”)。Find(&result),其中结果是[]字符串,但我得到了一个空数组。
答案 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(¤tSchema)
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")
的参数以及您将要使用的所有其他连接参数,例如dbname
或port
,user
等