GCP Spanner 在创建数据库时无法设置 DatabaseDialect

问题描述 投票:0回答:1

我有Python方法在GCP的Spanner中创建数据库,我想将数据库方言设置为PostgreSql:

from google.cloud import spanner
from google.cloud.spanner_admin_database_v1.types import spanner_database_admin, DatabaseDialect

def create_database(instance_id, database_id, extra_statements=None, database_dialect=DatabaseDialect.POSTGRESQL.value):
    """Create a new database"""
    if extra_statements is None:
        extra_statements = []
    spanner_client = spanner.Client()
    database_admin_api = spanner_client.database_admin_api

    request = spanner_database_admin.CreateDatabaseRequest(
        parent=database_admin_api.instance_path(
            spanner_client.project, instance_id
        ),
        create_statement=f"CREATE DATABASE `{database_id}`",
        extra_statements=extra_statements,
        database_dialect=database_dialect,
    )

    operation = database_admin_api.create_database(request=request)
    database = operation.result(OPERATION_TIMEOUT_SECONDS)

但是无论我为

database_dialect
参数设置什么值,我总是会收到此错误:

回溯(最近一次调用最后一次):文件 “/home/ghasem/dayrize-cloud/.venv/lib/python3.10/site-packages/google/api_core/grpc_helpers.py”, 第 76 行,在 error_remapped_callable 中 返回 callable_(*args, **kwargs) 文件“/home/ghasem/dayrize-cloud/.venv/lib/python3.10/site-packages/grpc/_channel.py”, 第 1161 行,在 call 中 返回_end_unary_response_blocking(状态,调用,False,无)文件 “/home/ghasem/dayrize-cloud/.venv/lib/python3.10/site-packages/grpc/_channel.py”, _end_unary_response_blocking 中的第 1004 行 raise _InactiveRpcError(state) # pytype:disable=not-instantiable grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with: status = StatusCode.INVALID_ARGUMENT details = "Invalid create statement. Database ids should be 2-30 characters long, contain only lowercase letters, numbers, underscores or hyphens, start with a letter and cannot end with an underscore or hyphen. Example of valid create statement: CREATE DATABASE "my-database"" debug_error_string = "UNKNOWN:Error received from peer ipv4:142.250.145.95:443 {grpc_message:"Invalid create statement. Database ids should be 2-30 characters long, contain only lowercase letters, numbers, underscores or hyphens, start with a letter and cannot end with an underscore or hyphen. Example of valid create statement: CREATE DATABASE "my-database"", grpc_status:3, created_time:"2024-04-11T15:00:12.70067553+00:00"}"

上述异常是导致以下异常的直接原因:

回溯(最近一次调用):文件“”,第 1 行,in 文件 “/home/ghasem/dayrize-cloud/dayrize-backend/src/dayrize_backend/helper/spanner.py”, 第 31 行,在 create_database 中 操作=database_admin_api.create_database(request=request) 文件 “/home/ghasem/dayrize-cloud/.venv/lib/python3.10/site-packages/google/cloud/spanner_admin_database_v1/services/database_admin/client.py”, 第 821 行,在 create_database 中 响应= rpc(文件“/home/ghasem/dayrize-cloud/.venv/lib/python3.10/site-packages/google/api_core/gapic_v1/method.py”, 第 131 行,在 call 中 返回wrapped_func(* args,** kwargs)文件“/home/ghasem/dayrize-cloud/.venv/lib/python3.10/site-packages/google/api_core/timeout.py”,第120行,在func_with_timeout中 返回 func(*args, **kwargs) 文件“/home/ghasem/dayrize-cloud/.venv/lib/python3.10/site-packages/google/api_core/grpc_helpers.py”, 第 78 行,在 error_remapped_callable 中 从 exc google.api_core.exceptions.InvalidArgument 引发 exceptions.from_grpc_error(exc):400 无效创建 陈述。数据库 ID 长度应为 2-30 个字符,仅包含 小写字母、数字、下划线或连字符,以 a 开头 字母且不能以下划线或连字符结尾。有效示例 创建语句:CREATE DATABASE "my-database" [链接 {
描述:“Cloud Spanner 数据库 ID 的规则。”网址: “https://cloud.google.com/spanner/docs/data-definition-language#database-id-names” }]

这些是我根据

文档
database_dialect设置的值:

database_dialect=DatabaseDialect.POSTGRESQL.value
database_dialect=DatabaseDialect.POSTGRESQL
database_dialect=2

我知道数据库名称很好,就像我从语句中删除

database_dialect
一样,它将毫无问题地创建数据库。

我在这里缺少什么?

python google-cloud-platform google-cloud-spanner
1个回答
0
投票

问题在于您正在使用 GoogleSQL 样式引用数据库名称。将其更改为以下内容:

OLD: create_statement=f"CREATE DATABASE `{database_id}`"
NEW: create_statement=f"CREATE DATABASE \"{database_id}\"",

(注意双引号而不是反引号!)

GoogleSQL 使用反引号 (``) 来引用标识符。 PostgreSQL 使用双引号 ("")。

© www.soinside.com 2019 - 2024. All rights reserved.