首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用Go和pq连接postgresql

无法使用Go和pq连接postgresql
EN

Stack Overflow用户
提问于 2021-03-07 01:14:29
回答 1查看 1.8K关注 0票数 1

我正在尝试将Go应用程序与postgresql连接起来。

应用程序导入postgresql驱动程序:

代码语言:javascript
复制
"crypto/tls"
"database/sql"
"fmt"
"log"
"os"
"os/signal"
 ...
_ "github.com/go-sql-driver/mysql"
_ "github.com/lib/pq"
_ "github.com/mattn/go-sqlite3"

并使用它连接到数据库:

代码语言:javascript
复制
driver, cnxn := dbFromURI(dbURI)
db, err := sql.Open(driver, cnxn)
if err != nil {
    panic(err)
}

而dbFromUri方法只是将信息拆分

代码语言:javascript
复制
func dbFromURI(uri string) (string, string) {
    parts := strings.Split(uri, "://")
    return parts[0], parts[1]
}

当我运行命令:psql postgresql://user:user@172.20.0.1:5432/lcp时,URI在本地工作

但我走了,我有了

代码语言:javascript
复制
./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

我尝试了这个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服务器中,我的风格也遇到了同样的问题。

代码语言:javascript
复制
postgres://user:user@172.20.0.1:5432/lcp?sslmode=disable

编辑2:

错误是由于脚本尝试准备命令。我更新了最小的示例,它也失败了。

代码语言:javascript
复制
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)
    }
}

我得到:准备失败

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-07 07:16:31

第一个问题是连接字符串中的一个错误: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正在等待此前缀。解析它

修复后,我能够使用基于您的代码的最小postgres客户端来建立连接。

若要亲自尝试此操作,请使用以下命令启动服务器:

代码语言:javascript
复制
docker run --rm -p 5432:5432 -e POSTGRES_PASSWORD=some_password postgres

并尝试使用以下客户端代码进行连接:

代码语言:javascript
复制
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)
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66512318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档