#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. Да, это сработало. боже, спасибо, спасибо, спасибо, спасибо, спасибо, спасибо. Пусть бог даст тебе брата Феррари.