【问题标题】:Unable to connect to postgresql using Go and pq无法使用 Go 和 pq 连接到 postgresql
【发布时间】:2021-03-08 00:58:34
【问题描述】:

我正在尝试将 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"

并使用like来连接数据库:

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 go pq


    【解决方案1】:

    第一个问题是连接字符串中的拼写错误: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 函数返回user: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 prefixparse 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)
        }
    }
    

    【讨论】:

    • 感谢您的回答。我纠正错字。在运行你的小测试功能时,我得到Successfully connected 但是当我运行服务器时,我仍然得到同样的错误。我添加了打印,我有2021/03/07 16:02:05 The driver postgres 2021/03/07 16:02:05 The cnxn user:user@172.20.0.1:5432/lcp?sslmode=disable panic: pq: SSL is not enabled on the server
    • 我终于找到了错误的原因。我更新了您的最小示例,但它也失败了。
    • @TeddyKossoko 那么问题出在哪里? 'Prepare' 函数是否获得了无效参数?
    • 我不知道。该问题尚未得到纠正。我不明白为什么我有这个问题。 db.prepare 适用于 sqlite3 甚至 mysql,因为它是通用的。你有什么想法吗?
    • @TeddyKossoko 谢谢,我今天会为他们创建一个 PR。
    猜你喜欢
    • 2023-04-08
    • 2016-07-13
    • 1970-01-01
    • 2012-11-01
    • 2019-11-02
    • 2011-03-29
    • 1970-01-01
    • 2020-01-01
    • 2019-09-02
    相关资源
    最近更新 更多