Python 构造 CASE WHEN update SQL 语句

Python to construct CASE WHEN update SQL statement

我尝试更新 BQ 中的 2K 行

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

我遇到了这个错误。我知道这太模糊了,无法像这样调试。

timeout=300.0, headers={'X-Server-Timeout': '300.0', 'Accept-Encoding': 'gzip', 'Content-Type': 'application/json', 'X-Goog-API-Client': 'gl-python/3.8.10 grpc/1.39.0 gax/2.0.0 gapic/2.26.0 gccl/2.26.0', 'User-Agent': 'gl-python/3.8.10 grpc/1.39.0 gax/2.0.0 gapic/2.26.0 gccl/2.26.0'})), last exception: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

我正在努力消除错误。我的 BQ 更新语法正确吗?

什么是 BQ 更新超时?

最后一个 UPDATE 声明的几个问题:

  • 避免引用 table 名称之类的标识符(除非 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)}
""")