使用GORM和Postgresql如何设置search_path?



如何从 gorm 获取当前模式? 通常它是"SHOW search_path"并且是执行官。 与设置当前search_path相同,通常"将search_path设置为新模式"。其中,新架构可以是一系列名称的单个架构名称。

我尝试了数据库。执行("显示search_path")。查找(&result),其中结果是一个[]字符串,我得到一个空数组。

通过像set search_path to newschema这样的执行查询来设置search_path是不正确的设置方式,因为这只会针对用于执行查询的连接进行更改。

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

发现了如何通过实验和提示在 PluralSite 的 GORM 类中显示当前模式。

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: %vn", currentSchema)

返回:搜索路径:"$user",公共

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

我为启动这一切而打的电话是:

tx := db.开始()

德克萨斯州。Exec("将search_path设置为 schema_name")

生成字符串以使用正确的设施架构名称。

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

然后我做的最后一件事就是tx。提交() 即使这些都是读取。

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

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

最新更新