GCP Spanner设置DatabaseDialect创建数据库报错求助
问题原因与解决方案
核心问题是PostgreSQL方言的CREATE DATABASE语句不支持用反引号包裹数据库ID,你的代码里用了反引号f"CREATE DATABASE {database_id}",这是Spanner原生方言的语法,当指定PostgreSQL方言时,这个写法会被判定为非法的数据库ID格式。
修正步骤
移除CREATE DATABASE语句中的反引号
把创建语句改成符合PostgreSQL语法的格式,不需要反引号:create_statement=f"CREATE DATABASE {database_id}"确保数据库ID符合PostgreSQL命名规范
PostgreSQL方言的数据库ID必须满足:- 以字母开头
- 仅包含字母、数字、下划线
- 长度1-30字符
- 推荐使用小写(如果要区分大小写,需要用双引号包裹,例如
CREATE DATABASE "MyDB",但不推荐)
优化database_dialect参数的使用
直接使用枚举值即可,不需要.value,因为API接受枚举类型:database_dialect=DatabaseDialect.POSTGRESQL
修正后的完整代码
from google.cloud import spanner from google.cloud.spanner_admin_database_v1.types import spanner_database_admin, DatabaseDialect # 补充原代码缺失的超时时间定义 OPERATION_TIMEOUT_SECONDS = 300 def create_database(instance_id, database_id, extra_statements=None, database_dialect=DatabaseDialect.POSTGRESQL): """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 ), # 移除反引号,符合PostgreSQL语法 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) return database
内容的提问来源于stack exchange,提问作者Ghasem
相关产品推荐
相关产品推荐

