Python Spanner客户端run_in_transaction报错‘Transaction is not begun’如何修复?
问题原因与修复方案
你遇到的问题核心是:DDL语句(如CREATE TABLE)不能通过run_in_transaction执行。run_in_transaction设计用于处理普通的读写事务,而Spanner要求DDL操作必须通过专门的DDL更新接口执行,这类操作不属于常规读写事务范畴,所以会抛出"Transaction is not begun"错误。
修复后的代码
from google.cloud import spanner from google.api_core.exceptions import GoogleAPICallError # 初始化Spanner客户端与资源 spanner_client = spanner.Client() instance = spanner_client.instance(instance_id) database = instance.database(database_id) # 执行DDL建表操作 try: # 直接传入DDL语句列表给update_ddl方法 database.update_ddl( [ 'CREATE TABLE test_table (id INT64, data STRING(MAX)) PRIMARY KEY (id)' ] ) print("表创建成功") except GoogleAPICallError as ex: print(ex) except ValueError as ex: print(ex)
关键说明
update_ddl是Spanner专门用于执行数据库结构变更的方法,它会自动处理DDL操作所需的事务逻辑,不需要手动管理事务。- 如果你需要执行多条DDL语句,可以把它们放在同一个列表中传入,Spanner会保证这些操作的原子性(要么全部成功,要么全部回滚)。
- 原代码中的
run_in_transaction仅适用于SELECT、INSERT、UPDATE、DELETE这类读写操作,不能用于DDL。
内容的提问来源于stack exchange,提问作者Kazuma Kusu
相关产品推荐
相关产品推荐

