如何在Cloud Run中通过go-migrate对Cloud SQL Postgres实例执行迁移?
Cloud SQL + go-migrate 迁移连接问题
问题概述
被这个问题困扰好几天了:已经通过Cloud SQL Go Connector成功连接数据库,但无法将该连接传递给go-migrate执行迁移。已确认Cloud Run权限配置正确,且遵循了官方示例代码逻辑。
初始实现代码
func connectToDb() (*pgxpool.Pool, error) { appConfig := utils.GetConfig() l := utils.GetLogger() // 配置数据库驱动连接参数 dsn := fmt.Sprintf("user=%s password=%s dbname=%s sslmode=disable", appConfig.DatabaseUser, appConfig.DatabasePassword, appConfig.DatabaseName) config, err := pgxpool.ParseConfig(dsn) if err != nil { l.Err(err).Msg("Failed to parse config") return nil, err } // 创建Cloud SQL拨号器 d, err := cloudsqlconn.NewDialer(context.Background()) if err != nil { l.Err(err).Msg("Failed to create dialer") return nil, err } // 设置驱动使用Cloud SQL Connector创建连接 config.ConnConfig.DialFunc = func(ctx context.Context, _ string, instance string) (net.Conn, error) { return d.Dial(ctx, appConfig.DbInstanceConnectionName) } // 创建数据库连接池 pool, err := pgxpool.NewWithConfig(context.Background(), config) if err != nil { l.Err(err).Msg("Failed to connect to database") return nil, err } l.Info().Msgf("Connected to database") l.Info().Msgf("Running migrations...") // ########## 迁移代码无法工作 ########## m, err := migrate.New( "file:///app/db/postgres/migration", fmt.Sprintf("user=%s password=%s database=%s host=%s", appConfig.DatabaseUser, appConfig.DatabasePassword, appConfig.DatabaseName, "/cloudsql/"+appConfig.DbInstanceConnectionName, ), ) if err != nil { l.Err(err).Msg("Failed to create migration") return nil, err } err = m.Up() if err != nil && err != migrate.ErrNoChange { l.Err(err).Msg("Failed to run migrations") return nil, err } l.Info().Msg("Migrations complete") return pool, nil }
初始错误日志
90m2024-07-07T21:32:21ZFailed to create migrationerror="no scheme"
修改后的代码(编辑1)
根据建议调整了迁移部分的实现:
db := stdlib.OpenDBFromPool(pool) driver, err := postgres.WithInstance(db, &postgres.Config{}) if err != nil { l.Err(err).Msg("Failed to create driver") return nil, err } m, err := migrate.NewWithDatabaseInstance( "file:///app/db/postgres/migration", appConfig.DatabaseName, driver, )
修改后的错误日志
2024-07-08T08:03:37Z ERR error pinging database error="failed to connect to `user=dev_db_user database=myapp`: /tmp/.s.PGSQL.5432 (/tmp): failed SASL auth: FATAL: password authentication failed for user \"dev_db_user\" (SQLSTATE 28P01)"
额外说明
已确认密码正确,环境变量配置无误,即使硬编码密码也无法解决该认证失败问题。
内容的提问来源于stack exchange,提问作者squish
相关产品推荐
相关产品推荐

