使用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

