# #sql #python-3.x #google-cloud-platform #google-bigquery #bq
Вопрос:
Я пытаюсь обновить 2 тысячи строк в BQ
def update_bq_ads_status_failed(self, update_ads):
affected_rows = 0
for update_ads_chunk in split(update_ads, _UPDATE_CHUNK_SIZE):
ad_ids = [item["ad_id"] for item in update_ads_chunk]
removal_errors = [item["removal_error"] for item in update_ads_chunk]
update_removal_error = ""
for ad_id, removal_error in zip(ad_ids, removal_errors):
update_removal_error = update_removal_error
f''' WHEN ad_id = '{ad_id}' Then '{removal_error}' '''
affected_rows = self.update_bq_ads_status(f"""
UPDATE '{table_full_name}'
SET status = 'Failed Removing'
SET removal_error = CASE {update_removal_error} END
WHERE ad_id IN {str(ad_ids)}
""")
return affected_rows
Я получаю эту ошибку. Я знаю, что это слишком расплывчато и невозможно отладить таким образом.
тайм-аут=300,0, заголовки={«Тайм-аут X-сервера»: «300,0», «Кодировка принятия»: «gzip», «Тип содержимого»: «приложение/json», «Клиент X-Goog-API»: «gl-python/3.8.10 grpc/1.39.0 gax/2.0.0 gapic/2.26.0 gccl/2.26.0», «Агент пользователя»: «gl-python/3.8.10 grpc/1.39.0 gax/2.0.0 gapic/2.26.0 gccl/2.26.0′})), последнее исключение: («Соединение прервано»., удаленно подключено («Удаленное закрытое соединение без ответа»))
Я пытаюсь устранить ошибки. Является ли мое обновление BQ синтаксически правильным?
Каков тайм-аут обновления BQ?
Комментарии:
1. Может ли быть так , что, как вы определили
$update_removal_error
, это включение в запрос становитсяSET removal_error = CASE WHEN ad_id = {ad_id} Then removal_error = {removal_error}
? Обратите внимание, что для указанного вами случая это положение становитсяremoval_error = removal_error = {removal_error}
.2. Спасибо вам обоим. Я отредактировал свой код. Я думаю, что сейчас это выглядит лучше.
3. Вы все еще получаете ту же ошибку после редактирования кода? Это тот самый код, который вы запускаете? Это просто выглядит как стандартная ошибка тайм — аута-ваш запрос занимает слишком много времени. Возможно, вы можете увеличить время ожидания с 300.
4. @Ник. Макдермэйд, я попробую еще раз. Я погуглю, как увеличить время ожидания в BQ и в Google-Ads api.
5. @Ник. McDermaid Я пытался увеличить время ожидания API G-Ads, но я не вижу поля времени ожидания в прото github.com/googleapis/googleapis/blob/… , несмотря на этот документ php: developers.google.com/google-ads/api/docs/client-libs/php/…
Ответ №1:
Несколько проблем с последним UPDATE
заявлением:
- Избегайте цитирования идентификаторов, таких как имена таблиц (если только GBQ не разрешает это)
SET
следует использовать один раз с разделением запятыми для нескольких столбцов- Квадратные скобки интерполируются в
WHERE
условии, для которого требуются круглые скобки
Рассмотрим скорректированный код:
update_removal_error = " ".join(
f"WHEN ad_id = '{ad_id}' THEN '{removal_error}'"
for ad_id, removal_error in zip(ad_ids, removal_errors)
)
affected_rows = self.update_bq_ads_status(f"""
UPDATE {table_full_name}
SET status = 'Failed Removing'
, removal_error = CASE {update_removal_error} END
WHERE ad_id IN {tuple(ad_ids)}
""")