Go中的Apache Beam IO:sql:unknown driver“cloudsql-postgres”(forgot import?)

brjng4g3  于 2023-05-20  发布在  Go
关注(0)|答案(1)|浏览(98)

按照这里的指南,我试图在Go中将Dataflow作业连接到GCP上的Cloud SQL Postgres示例。
我能够在我的机器上本地运行作业。我已验证我的权限是否正确,并且作业具有所需的权限。
问题是,当我尝试运行作业时,我得到以下错误:
Name: github.com/apache/beam/sdks/v2/go/pkg/beam/io/databaseio.queryFn] failed: failed to open database: cloudsql-postgres caused by: sql: unknown driver "cloudsql-postgres" (forgotten import?)
这是我用来连接的代码:

func ReadFromPostgres(
    ctx context.Context,
    scope beam.Scope,
    opt *SourceOption,
    secretReader *SecretReader,
    elemType reflect.Type,
    query string,
    postgresDriver string,
) (beam.PCollection, error) {
    cleanup, err := pgxv4.RegisterDriver(postgresDriver, cloudsqlconn.WithIAMAuthN())
    if err != nil {
        return beam.PCollection{}, fmt.Errorf("error connecting to Postgres: %w", err)
    }

    //nolint:all
    defer cleanup()

    scope = scope.Scope("Read from database")

    secret, err := opt.Database.DSN.GetValue(ctx, secretReader)
    if err != nil {
        return beam.PCollection{}, fmt.Errorf("error getting secret value: %w", err)
    }
    envName, location, dbInstanceName, user, dbName := opt.Database.PGEnv.EnvName, opt.Database.PGEnv.Location, opt.Database.PGEnv.DBInstanceName, opt.Database.PGEnv.User, opt.Database.PGEnv.DBName
    dsn := fmt.Sprintf("host=%s:%s:%s user=%s dbname=%s password=%s sslmode=disable", envName, location, dbInstanceName, user, dbName, secret)

    if err != nil {
        return beam.PCollection{}, fmt.Errorf("error getting DSN value: %w", err)
    }

    return databaseio.Query(scope, postgresDriver, dsn, query, elemType), nil

请注意,“cloudsql-postgres”是传递给postgresDriver参数的参数,我正在传递给函数。
以下是我的进口:

import (
    "context"
    "fmt"
    "reflect"
    "time"

    "cloud.google.com/go/bigquery"
    "cloud.google.com/go/cloudsqlconn"
    "cloud.google.com/go/cloudsqlconn/postgres/pgxv4"
    "github.com/apache/beam/sdks/v2/go/pkg/beam"
    "github.com/apache/beam/sdks/v2/go/pkg/beam/io/bigqueryio"
    "github.com/apache/beam/sdks/v2/go/pkg/beam/io/databaseio"
    "google.golang.org/api/iterator"
)

我认为我的驱动程序应该包含在“cloud.google.com/go/cloudsqlconn/postgres/pgxv4“导入中。为什么我的驱动程序不能被函数正确识别?

e4eetjau

e4eetjau1#

您可以尝试导入必要的驱动程序包(github.com/GoogleCloudPlatform/cloudsql-proxy/proxy/dialers/postgres)。此软件包包含用于Cloud SQL Proxy的“cloudsql-postgres”驱动程序实现。

相关问题