按照这里的指南,我试图在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“导入中。为什么我的驱动程序不能被函数正确识别?
1条答案
按热度按时间e4eetjau1#
您可以尝试导入必要的驱动程序包(
github.com/GoogleCloudPlatform/cloudsql-proxy/proxy/dialers/postgres
)。此软件包包含用于Cloud SQL Proxy的“cloudsql-postgres”驱动程序实现。