Gorm连接PostgreSQL时如何指定目标数据库而非默认库?
Go + Gorm 连接PostgreSQL时始终连接默认数据库的问题与解决
问题描述
使用Gorm连接PostgreSQL时,明明在DSN中指定了目标数据库my_database_name,但应用始终连接默认的postgres数据库。
连接数据库代码
func (app *Application) ConnectToPostgres() error { dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=UTC", app.Config.DB.Host, app.Config.DB.User, app.Config.DB.Password, app.Config.DB.DBName, app.Config.DB.Port, ) // 尽管DSN指定了'my_database_name',但连接仍使用'postgres' db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { return err } app.DB = db return nil }
配置信息
.env文件内容:
DB_HOST=localhost DB_PORT=5432 DB_USER=postgres DB_PASSWORD= DB_NAME=my_database_name
已验证内容
- 数据库
my_database_name已存在 - 连接字符串包含正确的数据库名称
- 打印DSN显示格式正确
- 可通过psql正常访问该数据库
额外环境信息
- Go版本:1.23.3
- Gorm版本:1.25.12
- PostgreSQL版本:16.3
- 操作系统:Arch Linux
主文件代码
package main import ( "flag" "log" "os" "github.com/gin-gonic/gin" "github.com/joho/godotenv" "github.com/lordaris/aris-erp/api" ) func main() { r := gin.Default() // 从.env文件加载环境变量 err := godotenv.Load(".env") if err != nil { log.Fatal("Error loading .env file") } var cfg api.Config flag.StringVar(&cfg.DB.Host, "db-host", os.Getenv("DB_HOST"), "PostgreSQL host") flag.StringVar(&cfg.DB.Port, "db-port", os.Getenv("DB_PORT"), "PostgreSQL port") flag.StringVar(&cfg.DB.User, "db-user", os.Getenv("DB_USER"), "PostgreSQL user") flag.StringVar(&cfg.DB.Password, "db-password", os.Getenv("DB_PASSWORD"), "PostgreSQL password") flag.StringVar(&cfg.DB.DBName, "db-name", os.Getenv("DB_NAME"), "PostgreSQL database name") flag.Parse() app := api.NewApplication(cfg) // 连接PostgreSQL if err := app.ConnectToPostgres(); err != nil { log.Fatal("Could not connect to PostgreSQL: ", err) } // 路由设置 api.Router(r, app) r.Run() }
问题排查与解决
修改数据库连接用户名时触发错误,提示“以该用户名为名的数据库不存在”,由此定位到核心问题:连接字符串中密码为空值,导致参数解析移位,空密码被错误解析为数据库名称。
解决方法
- 无密码场景:从连接字符串中完全移除
password=相关占位符,修改后的DSN格式如下:dsn := fmt.Sprintf("host=%s user=%s dbname=%s port=%s sslmode=disable TimeZone=UTC", app.Config.DB.Host, app.Config.DB.User, app.Config.DB.DBName, app.Config.DB.Port, ) - 有密码场景:为数据库用户设置实际密码,并在
.env文件中填写DB_PASSWORD的有效值。
内容的提问来源于stack exchange,提问作者Aris
相关产品推荐
相关产品推荐

