php小编子墨在使用pgx连接到Postgres数据库AWS RDS时遇到了问题。他发现无法成功建立连接,尽管他已经按照官方文档和其他资源提供的指导进行了配置。他尝试了多种方法,包括检查数据库权限、确认网络连接、修改配置文件等,但问题依然存在。他希望能够得到解决这个问题的有效方法。
问题内容
我尝试使用 github.com/jackc/pgx/v5
包在 Go 程序中连接到 AWS RDS 中的 postgres 数据库,但出现以下错误:
failed to connect to `host=xxxxx.xxxxxxx.us-east-1.rds.amazonaws.com user=golangpg database=golangpg`: server error (FATAL: database "golangpg" does not exist (SQLSTATE 3D000))
exit status 1
登录后复制
即使明确指出数据库不存在也是错误,但我已经创建了 RDS 数据库,并且我也可以通过 pgAdmin 连接到该数据库。但是当我尝试在 Go 代码中进行连接时,出现了上述错误。
我检查了以下几点
package database
import (
"context"
"fmt"
"os"
"strconv"
"github.com/jackc/pgx/v5"
"github.com/joho/godotenv"
)
func PGConnection() *pgx.Conn {
envErr := godotenv.Load()
if envErr != nil {
fmt.Println("Error in loading .env file, ", envErr)
}
host := os.Getenv("DB_URL")
port := os.Getenv("DB_PORT")
user := os.Getenv("DB_USERNAME")
password := os.Getenv("DB_PASSWORD")
dbname := os.Getenv("DB_NAME")
portInt, er := strconv.Atoi(port)
if er != nil {
fmt.Println("Error in converting string to number", er)
}
var err error
pgConnString := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=require", host, portInt, user, password, dbname)
pgConn, err := pgx.Connect(context.Background(), pgConnString)
if err != nil {
fmt.Printf("Unable to connection to database: n%vn", err)
os.Exit(1)
} else {
fmt.Println("Database connection establised to db ", dbname)
}
return pgConn
}
var Connection *pgx.Conn = PGConnection()
登录后复制
这里可能有什么错误。即使从 pgAdmin 我也可以创建表,但无法从我的 Go 代码连接。
解决方法
该问题是因为您的 RDS PostgreSQL 主机中不存在 数据库“golangpg”。
RDS标识符!=数据库名称
我在这里重新创建您的设置:
PostgreSQL RDS
执行相同的代码并得到相同的错误:
▶ go run main.go
Unable to connection to database:
failed to connect to `host=golangdb.xxxx.eu-central-1.rds.amazonaws.com user=postgres database=golangdb`: server error (FATAL: database "golangdb" does not exist (SQLSTATE 3D000))
exit status 1
登录后复制
原因是数据库“golangdb”不存在
在我的PostgreSQL RDS中不存在。
连接到数据库主机并列出可用的数据库。
▶ psql --host=golangdb.xxxxx.eu-central-1.rds.amazonaws.com --username=postgres
postgres=> l
List of databases
Name | Owner | Encoding | Locale Provider | Collate | Ctype
-----------+----------+----------+-----------------+-------------+-------------
postgres | postgres | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8
rdsadmin | rdsadmin | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8
登录后复制
这也是使用 dbname := "postgres"
有效的原因,因为数据库存在于主机中。
▶ go run main.go
Database connection establised to db postgres
登录后复制
创建新数据库
postgres=> CREATE DATABASE golangdb;
CREATE DATABASE
postgres=> l
List of databases
Name | Owner | Encoding | Locale Provider | Collate | Ctype
-----------+----------+----------+-----------------+-------------+-------------
golangdb | postgres | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8
postgres | postgres | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8
rdsadmin | rdsadmin | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8
登录后复制
重试 go 代码
▶ go run main.go
Database connection establised to db golangdb
登录后复制
以上就是无法使用 pgx 连接到 postgres 数据库 AWS RDS的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!