Azure Table备份拉取超1000行:目标表加日期后缀时报表不存在如何解决
问题原因
你调整代码后混淆了源表名和目标表名的参数传递。
原代码中源存储、目标存储的表名完全一致,所以函数内用同一个tb_name参数既做源表查询名、又做目标表写入名不会出问题。调整逻辑后目标表名追加了日期后缀,两者不再是同一个值,但你还是把带日期的目标表名传给了函数,分页查询源表下一页数据时,用带日期的名称去源存储查表,自然会报「表不存在」的错误。
另外你的代码还有一个隐性问题:today变量没有提前定义赋值,直接拼接也会触发运行错误。
修复方案
把函数的表名参数拆分为源表名、目标表名两个独立参数,分页查询时统一用源表名查源存储,写入时用目标表名写入目标存储即可,修复后代码如下:
from azure.cosmosdb.table.tableservice import TableService,ListGenerator from datetime import date table_service_out = TableService(account_name='', account_key='') table_service_in = TableService(account_name='', account_key='') query_size = 100 # 补全日期变量定义 today = date.today().strftime("%Y%m%d") def queryAndSaveAllDataBySize(source_tb_name, target_tb_name, resp_data:ListGenerator ,table_out:TableService,table_in:TableService,query_size:int): for item in resp_data: # 移除表服务自动追加的etag和Timestamp del item.etag del item.Timestamp print(f"insert data:{str(item)} into table:{target_tb_name}") table_in.insert_or_replace_entity(target_tb_name,item) if resp_data.next_marker: # 分页查询源表时使用源表名 data = table_out.query_entities(table_name=source_tb_name,num_results=query_size,marker=resp_data.next_marker) queryAndSaveAllDataBySize(source_tb_name, target_tb_name, data,table_out,table_in,query_size) tbs_out = table_service_out.list_tables() print(tbs_out) for tb in tbs_out: source_table = tb.name target_table = tb.name + today # 在目标存储创建带日期后缀的对应表 table_service_in.create_table(table_name=target_table, fail_on_exist=False) # 首次查询使用源表名查源存储 data = table_service_out.query_entities(source_table,num_results=query_size) # 传入两个独立表名参数调用函数 queryAndSaveAllDataBySize(source_table, target_table, data,table_service_out,table_service_in,query_size)
内容的提问来源于stack exchange,提问作者Nayden Van
相关产品推荐
相关产品推荐

