Python для построения СЛУЧАЯ ПРИ обновлении инструкции SQL

# #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)}
""")