You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pgx连接AWS RDS PostgreSQL失败:数据库不存在错误排查

问题:使用pgx连接AWS RDS PostgreSQL提示数据库不存在,但实际已创建

连接时出现以下错误:

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

已确认:

  • 安全组允许5432端口所有流量
  • 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%v\n", err)
        os.Exit(1)
    } else {
        fmt.Println("Database connection establised to db ", dbname)
    }

    return pgConn
}

var Connection *pgx.Conn = PGConnection()

可能的原因及排查方向

  • 环境变量未正确加载:
    godotenv.Load()默认读取当前工作目录下的.env文件,如果程序运行目录和.env文件所在目录不一致,就会加载失败,导致dbname等变量为空或错误。可以在代码里添加打印语句,输出dbname的值确认:

    fmt.Println("当前使用的数据库名:", dbname)
    

    同时检查.env文件里的DB_NAME是否确实设置为golangpg,变量名是否拼写正确(比如有没有写成DBNAME或者DB_NAME_)。

  • 端口转换错误导致连接异常:
    如果DB_PORT环境变量为空或不是有效数字,strconv.Atoi会报错,但代码里仅打印错误仍继续执行,此时portInt会是0。虽然错误信息里显示的host和user正确,但异常端口可能导致连接到非目标实例,建议确认DB_PORT是否设置为5432,并且转换后的值正确。

  • 数据库名称大小写问题:
    PostgreSQL对数据库名称的大小写敏感,如果创建数据库时使用了双引号(比如CREATE DATABASE "GolangPG"),那么实际数据库名是大小写敏感的,而代码里用小写golangpg就会找不到。检查pgAdmin里的数据库名称是否和代码里的完全一致,包括大小写。

  • SSL模式不匹配:
    代码里设置了sslmode=require,而pgAdmin可能使用的是prefer或其他SSL模式。虽然这通常不会直接导致“数据库不存在”的错误,但可以尝试修改sslmode为verify-full或者prefer,看是否能解决问题。

  • 连接串格式问题:
    可以尝试改用URL格式的连接串测试,避免字符串拼接时的格式错误:

    pgConnString := fmt.Sprintf("postgres://%s:%s@%s:%d/%s?sslmode=require", user, password, host, portInt, dbname)
    

内容的提问来源于stack exchange,提问作者Athavan T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 17:54:53