连接到 postgreSQL 模式

17

我希望连接并查询PostgreSQL数据库,但我只想连接到特定的模式

根据文档(JDBC)的说法,我们可以使用

jdbc:postgresql://localhost:5432/mydatabase?searchpath=myschema

自 9.4 版本开始,您可以使用新的 currentSchema 参数指定 URL,如下所示:

或者 更新,自 9.4 版本开始,您可以使用新的 currentSchema 参数指定 URL,如下所示:
jdbc:postgresql://localhost:5432/mydatabase?currentSchema=myschema

但我无法使用 golang SQL driver; 根据文档,我们也可以使用 SET search_path TO myschema,public; 但我只想在初始化时声明一次,但我认为这需要每次新连接都执行。

此外,我正在使用以下代码,请帮助我识别要传递给它的正确参数,以便仅连接模式。

db, err := sql.Open("postgres", `dbname=`+s.settings.Database+
` user=`+s.settings.Username+` password=`+s.settings.Password+
` host=`+s.settings.Url+` sslmode=disable`) 

添加 currentSchema=myschemasearchpath=myschema 并没有起作用!

我是否可以在GO中仅连接到特定的数据库架构?


1
jdbc 是 Java,不是 Go。 - Woot4Moo
@Woot4Moo,我知道这一点,所以我提到了“按照文档”,如果不清楚,很抱歉,但是我已经在下面的代码片段中尝试添加了currentSchema=myschema到语句中,但它没有起作用。 - Abhishek Soni
3个回答

12

您应该在dataSourceName中添加search_path=myschema

P.S.最好使用fmt.Sprintf("host =%s port =%d dbname =%s user =%s password ='%s' sslmode = disable search_path =%s",...)而不是使用``+''


在我的Postgres URL中添加search_path对我很有用,谢谢! - Hugo Sohm

4

确保设置Search_path正确并仅执行一次。例如:

db, err := sql.Open("postgres",
    "host=localhost dbname=Test sslmode=disable user=postgres password=secret")
if err != nil {
   log.Fatal("cannot connect ...")
}
defer db.Close()
db.Exec(`set search_path='mySchema'`)

rows, err := db.Query(`select blah,blah2 from myTable`)
...

我正在使用以下代码:db, err := sql.Open("postgres", `dbname=`+dbName+` user=`+username+` password=`+password+` host=`+host+` sslmode=disable`) if err != nil { panic("Main db connection failed") } db.SetMaxIdleConns(40) db.SetMaxOpenConns(160)因此有许多并行连接,我怀疑执行此代码 db.Exec(set search_path='mySchema') 是否会为每个连接设置模式? - Abhishek Soni
@AbhishekSoni,你在用另一种方式写我写过的代码。执行exec需要每次连接只执行一次。就像您需要每个连接打开(Open())一次数据库,每个数据库需要执行(Exec)一次。 - Cetin Basoz
我对连接的功能感到困惑,但确实想知道 db.Exec(set search_path='mySchema') 是每个OPEN仅需要执行一次,而不是每个连接(例如,我将maxConns设置为40,因此需要执行40次)? - Abhishek Soni
为什么不直接测试一下呢? - Cetin Basoz
@AbhishekSoni 你应该使用事务。 - Ilia Choly

-2
设置Search_path对我没有起作用。

在dsn(连接字符串)中设置search_path=myschema非常完美地工作了。 - nator
1
这并没有回答问题。一旦你拥有足够的声望,你就可以评论任何帖子;相反,提供不需要提问者澄清的答案。- 来自审核 - JimB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接