Резервное копирование таблиц Azure позволяет получить более 1000 строк

#azure #azure-python-sdk

Вопрос:

Я надеюсь, что кто — нибудь сможет помочь мне решить эту проблему.

У меня есть следующий сценарий

 
from azure.cosmosdb.table.tableservice import TableService,ListGenerator
from azure.storage.blob import BlobServiceClient
from datetime import date
from datetime import *




def queryAndSaveAllDataBySize(tb_name,resp_data:ListGenerator ,table_out:TableService,table_in:TableService,query_size:int):
    for item in resp_data:
        #remove etag and Timestamp appended by table service
        del item.etag
        del item.Timestamp
        print("instet data:"   str(item)   "into table:"  tb_name)
        table_in.insert_or_replace_entity(tb_name,item)
    if resp_data.next_marker:
        data = table_out.query_entities(table_name=tb_name,num_results=query_size,marker=resp_data.next_marker)
        queryAndSaveAllDataBySize(tb_name,data,table_out,table_in,query_size)


tbs_out = table_service_out.list_tables()

for tb in tbs_out:
    #create table with same name in storage2
    table_service_in.create_table(table_name=tb.name, fail_on_exist=False)
    #first query
    data = table_service_out.query_entities(tb.name,num_results=query_size)
    queryAndSaveAllDataBySize(tb.name,data,table_service_out,table_service_in,query_size)
 

этот код проверит таблицу , storageA скопирует их и создаст ту же таблицу StorageB , и благодаря marker этому я смогу получить x_ms_continuation токен, если у меня будет более 1000 строк на запросы.

Само собой разумеется, что это и так прекрасно работает.

Но вчера я пытался внести некоторые изменения в код следующим образом:

If in storageA I have a table name TEST, I storageB I want to create a table named TEST20210930, basically the table name from storageA today date

Именно здесь код начинает разрушаться.

 
table_service_out = TableService(account_name='', account_key='')
table_service_in = TableService(account_name='', account_key='')
query_size = 100

#save data to storage2 and check if there is lefted data in current table,if yes recurrence
def queryAndSaveAllDataBySize(tb_name,resp_data:ListGenerator ,table_out:TableService,table_in:TableService,query_size:int):
    for item in resp_data:
        #remove etag and Timestamp appended by table service
        del item.etag
        del item.Timestamp
        print("instet data:"   str(item)   "into table:"  tb_name)
        table_in.insert_or_replace_entity(tb_name,item)
    if resp_data.next_marker:
        data = table_out.query_entities(table_name=tb_name,num_results=query_size,marker=resp_data.next_marker)
        queryAndSaveAllDataBySize(tb_name,data,table_out,table_in,query_size)


tbs_out = table_service_out.list_tables()
print(tbs_out)

for tb in tbs_out:
    table = tb.name   today
    print(target_connection_string)
    #create table with same name in storage2
    table_service_in.create_table(table_name=table, fail_on_exist=False)

    #first query
    data = table_service_out.query_entities(tb.name,num_results=query_size)
    queryAndSaveAllDataBySize(table,data,table_service_out,table_service_in,query_size)
 

Что здесь происходит, так это то, что код выполняется до предела query_size, но затем завершается ошибкой, указывающей на то, что таблица не найдена.

Я немного запутался здесь, и, может быть, кто-нибудь сможет помочь определить мою ошибку.

Пожалуйста, если вам нужна дополнительная информация, просто спросите

Огромное вам спасибо.

КАК ВОСПРОИЗВЕСТИ: На портале azure создайте 2 учетные записи хранения. Хранилище и хранилище.

В хранилище A создайте таблицу и заполните ее данными, более 100 (на основе query_size. Установите конечные точки конфигурации. table_service_out = Хранилище и table_storage_in = хранилище

Комментарии:

1. Какой SDK вы используете?

2. Привет, Гаурав. Я только что обновил свой пост с помощью sdk

Ответ №1:

Я полагаю, что проблема заключается в следующей строке кода:

 data = table_out.query_entities(table_name=tb_name,num_results=query_size,marker=resp_data.next_marker)
 

Если вы заметили, tb_name это имя таблицы в вашей целевой учетной записи, которое, очевидно, отсутствует в вашей исходной учетной записи. Поскольку вы выполняете запрос из несуществующей таблицы, вы получаете эту ошибку.

Чтобы исправить это, вы также должны передать имя исходной таблицы queryAndSaveAllDataBySize и использовать его при запросе сущностей в этой функции.

Обновить

Пожалуйста, взгляните на код ниже:

 table_service_out = TableService(account_name='', account_key='')
table_service_in = TableService(account_name='', account_key='')
query_size = 100

#save data to storage2 and check if there is lefted data in current table,if yes recurrence
def queryAndSaveAllDataBySize(source_table_name, target_table_name,resp_data:ListGenerator ,table_out:TableService,table_in:TableService,query_size:int):
    for item in resp_data:
        #remove etag and Timestamp appended by table service
        del item.etag
        del item.Timestamp
        print("instet data:"   str(item)   "into table:"  tb_name)
        table_in.insert_or_replace_entity(target_table_name,item)
    if resp_data.next_marker:
        data = table_out.query_entities(table_name=source_table_name,num_results=query_size,marker=resp_data.next_marker)
        queryAndSaveAllDataBySize(source_table_name, target_table_name, data,table_out,table_in,query_size)


tbs_out = table_service_out.list_tables()
print(tbs_out)

for tb in tbs_out:
    table = tb.name   today
    print(target_connection_string)
    #create table with same name in storage2
    table_service_in.create_table(table_name=table, fail_on_exist=False)

    #first query
    data = table_service_out.query_entities(tb.name,num_results=query_size)
    queryAndSaveAllDataBySize(tb.name, table,data,table_service_out,table_service_in,query_size)
 

Комментарии:

1. Да, это правда. Но то, что я имею в виду. когда я create создаю таблицу в хранилище, я хочу, чтобы у этой таблицы было имя таблицы в хранилище Сегодняшняя дата. Поскольку весь этот код будет выполняться раз в неделю, я хочу, чтобы было ясно, к какой дате относится эта резервная копия. И это моя главная проблема, и я понятия не имею, как ее решить. Если в storageA у меня есть имя таблицы Table , я хочу, чтобы тот же контент был скопирован в таблицу в storageB с именем Table20210930

2. 2 минуты, и я обновлю свой пост новым кодом. Что он делает именно то, что я хочу, но терпит неудачу после того, как размер запроса достигает порогового значения

3. Это вполне понятно, но в вашем коде есть логический изъян. Таблица, указанная tb_name переменной, не существует в вашей учетной записи исходного хранилища (хранилище A). Вот что я пытаюсь здесь сказать.

4. Обновил свой ответ измененным кодом. Пожалуйста, взгляните на это. ХТ.

5. Да, это сработало. боже, спасибо, спасибо, спасибо, спасибо, спасибо, спасибо. Пусть бог даст тебе брата Феррари.