无法使用 Go 和 pq 连接到 postgresql
Unable to connect to postgresql using Go and pq
我正在尝试将 Go 应用程序与 postgresql 连接。
应用导入postgresql驱动:
"crypto/tls"
"database/sql"
"fmt"
"log"
"os"
"os/signal"
...
_ "github.com/go-sql-driver/mysql"
_ "github.com/lib/pq"
_ "github.com/mattn/go-sqlite3"
并使用它来连接数据库:
driver, cnxn := dbFromURI(dbURI)
db, err := sql.Open(driver, cnxn)
if err != nil {
panic(err)
}
而 dbFromUri 方法只是拆分了信息
func dbFromURI(uri string) (string, string) {
parts := strings.Split(uri, "://")
return parts[0], parts[1]
}
当我 运行 命令时,我的 URI 在本地工作:psql postgresql://user:user@172.20.0.1:5432/lcp
但是在 go i Go 中,我得到了
./lcpserver
2021/03/07 02:00:42 Reading config /root/lcp-server-install/lcp-home/config/config.yaml
panic: pq: SSL is not enabled on the server
我为 Go 尝试了这个 URI 但没有成功:psql postgresql://user:user@172.20.0.1:5432/lcp?sslmode=disable
你知道为什么我无法连接吗?
我尝试使用我的 aws rds postgres 数据库,得到了相同的结果。感谢您的帮助。
服务器完整代码
https://github.com/readium/readium-lcp-server/blob/master/lcpserver/lcpserver.go
我更改了拼写错误和演示,前提是我成功连接了。但在 lcp 服务器中,我遇到了同样的问题。
postgres://user:user@172.20.0.1:5432/lcp?sslmode=disable
编辑 2:
错误是由于脚本尝试准备命令。我更新了最小的例子,它也失败了。
package main
import (
"database/sql"
"fmt"
"strings"
_ "github.com/lib/pq"
)
func dbFromURI(uri string) (string, string) {
parts := strings.Split(uri, "://")
return parts[0], parts[1]
}
func main() {
driver, cnxn := dbFromURI("postgres://user:user@172.20.0.1:5432/lcp?sslmode=disable")
fmt.Println("The driver " + driver)
fmt.Println("The cnxn " + cnxn)
db, err := sql.Open(driver, cnxn)
_, err = db.Prepare("SELECT id,encryption_key,location,length,sha256,type FROM content WHERE id = ? LIMIT 1")
if err != nil {
fmt.Println("Prepare failed")
fmt.Println(err)
}
if err == nil {
fmt.Println("Successfully connected")
} else {
panic(err)
}
}
我得到了:
准备失败
pq: SSL is not enabled on the server
2021/03/07 17:20:13 This panic 3
panic: pq: SSL is not enabled on the server
第一个问题是连接字符串中的拼写错误:postgresql://user:user@172.20.0.1:5432/lcp?sslmode=disable
。在 Go 代码中它应该是 postgres://user:user@172.20.0.1:5432/lcp?sslmode=disable
.
我们还需要将完整的连接字符串作为第二个参数传递给 sql.Open
。目前,dbFromURI
函数returnsuser:user@172.20.0.1:5432/lcp?sslmode=disable
,但我们需要postgres://user:user@172.20.0.1:5432/lcp?sslmode=disable
,因为pq is waiting for this prefix to parse it.
修复此问题后,我能够根据您的代码使用最小的 postgres 客户端建立连接。
要自己尝试,请使用以下命令启动服务器:
docker run --rm -p 5432:5432 -e POSTGRES_PASSWORD=some_password postgres
并尝试使用以下客户端代码进行连接:
package main
import (
"database/sql"
"fmt"
_ "github.com/lib/pq"
)
func main() {
cnxn := "postgres://postgres:some_password@127.0.0.1:5432/lcp?sslmode=disable"
_, err := sql.Open("postgres", cnxn)
if err != nil {
panic(err)
}
_, err = db.Prepare("SELECT id,encryption_key,location,length,sha256,type FROM content WHERE id = ? LIMIT 1")
if err != nil {
fmt.Println("Prepare failed")
panic(err)
}
}
我正在尝试将 Go 应用程序与 postgresql 连接。
应用导入postgresql驱动:
"crypto/tls"
"database/sql"
"fmt"
"log"
"os"
"os/signal"
...
_ "github.com/go-sql-driver/mysql"
_ "github.com/lib/pq"
_ "github.com/mattn/go-sqlite3"
并使用它来连接数据库:
driver, cnxn := dbFromURI(dbURI)
db, err := sql.Open(driver, cnxn)
if err != nil {
panic(err)
}
而 dbFromUri 方法只是拆分了信息
func dbFromURI(uri string) (string, string) {
parts := strings.Split(uri, "://")
return parts[0], parts[1]
}
当我 运行 命令时,我的 URI 在本地工作:psql postgresql://user:user@172.20.0.1:5432/lcp
但是在 go i Go 中,我得到了
./lcpserver
2021/03/07 02:00:42 Reading config /root/lcp-server-install/lcp-home/config/config.yaml
panic: pq: SSL is not enabled on the server
我为 Go 尝试了这个 URI 但没有成功:psql postgresql://user:user@172.20.0.1:5432/lcp?sslmode=disable
你知道为什么我无法连接吗? 我尝试使用我的 aws rds postgres 数据库,得到了相同的结果。感谢您的帮助。
服务器完整代码 https://github.com/readium/readium-lcp-server/blob/master/lcpserver/lcpserver.go
我更改了拼写错误和演示,前提是我成功连接了。但在 lcp 服务器中,我遇到了同样的问题。
postgres://user:user@172.20.0.1:5432/lcp?sslmode=disable
编辑 2:
错误是由于脚本尝试准备命令。我更新了最小的例子,它也失败了。
package main
import (
"database/sql"
"fmt"
"strings"
_ "github.com/lib/pq"
)
func dbFromURI(uri string) (string, string) {
parts := strings.Split(uri, "://")
return parts[0], parts[1]
}
func main() {
driver, cnxn := dbFromURI("postgres://user:user@172.20.0.1:5432/lcp?sslmode=disable")
fmt.Println("The driver " + driver)
fmt.Println("The cnxn " + cnxn)
db, err := sql.Open(driver, cnxn)
_, err = db.Prepare("SELECT id,encryption_key,location,length,sha256,type FROM content WHERE id = ? LIMIT 1")
if err != nil {
fmt.Println("Prepare failed")
fmt.Println(err)
}
if err == nil {
fmt.Println("Successfully connected")
} else {
panic(err)
}
}
我得到了: 准备失败
pq: SSL is not enabled on the server
2021/03/07 17:20:13 This panic 3
panic: pq: SSL is not enabled on the server
第一个问题是连接字符串中的拼写错误:postgresql://user:user@172.20.0.1:5432/lcp?sslmode=disable
。在 Go 代码中它应该是 postgres://user:user@172.20.0.1:5432/lcp?sslmode=disable
.
我们还需要将完整的连接字符串作为第二个参数传递给 sql.Open
。目前,dbFromURI
函数returnsuser:user@172.20.0.1:5432/lcp?sslmode=disable
,但我们需要postgres://user:user@172.20.0.1:5432/lcp?sslmode=disable
,因为pq is waiting for this prefix to parse it.
修复此问题后,我能够根据您的代码使用最小的 postgres 客户端建立连接。
要自己尝试,请使用以下命令启动服务器:
docker run --rm -p 5432:5432 -e POSTGRES_PASSWORD=some_password postgres
并尝试使用以下客户端代码进行连接:
package main
import (
"database/sql"
"fmt"
_ "github.com/lib/pq"
)
func main() {
cnxn := "postgres://postgres:some_password@127.0.0.1:5432/lcp?sslmode=disable"
_, err := sql.Open("postgres", cnxn)
if err != nil {
panic(err)
}
_, err = db.Prepare("SELECT id,encryption_key,location,length,sha256,type FROM content WHERE id = ? LIMIT 1")
if err != nil {
fmt.Println("Prepare failed")
panic(err)
}
}