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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 11:40:06