代码之家  ›  专栏  ›  技术社区  ›  searain

谷歌应用程序脚本-检查表是否存在,如果存在,删除表,检查删除任务是否完成

  •  0
  • searain  · 技术社区  · 6 年前

    我正在努力寻找 谷歌应用程序脚本->高级服务->BigQuery . 这个 Apps Script BigQuery reference 只提供一些样本,不涵盖所有方法。
    我们应该检查方法参数的API引用。

    这就是我想做的

    1. 检查表是否存在
    2. 删除它,如果它确实存在
    3. 检查删除作业是否已完成

    检查表是否存在

    删除它,如果它确实存在

    我找不到检查表是否存在的方法。所以我必须先删除表(不管它是否存在),在一个尝试块中包装删除。

    try {
      var deleteResults = BigQuery.Tables.remove(project, dataset, table);
      Logger.log(deleteResults);   
    } catch (err){
      //return false;
    }
    

    这是执行任务的正确方式“检查表是否存在,如果它存在,删除它”?

    检查删除是否完成

    现在,我想知道这个工作是不是由

    BigQuery.Tables.remove(project, dataset, table);
    

    已经完成了,但是 Logger.log(deleteResults); 只记录 null 以下内容:

    [18-07-19 14:12:24:927 PDT] null
    

    所以 BigQuery.Tables.remove 方法不返回任何内容?如何知道删除作业是否已完成?

    1 回复  |  直到 6 年前
        1
  •  2
  •   tehhowch    6 年前

    文档中解释的“高级服务”只是相关googleapi的包装器。因此,在Apps脚本中找不到有关高级服务的文档,因为这些方法在相应的API页面上有详细的说明您可以使用编辑器中的自动完成来确定方法签名,或者按照 Google's tips

    您可以通过以下方式确定表是否存在 list ing all tables in your project & dataset ,然后检查相关属性( id 我是说, friendlyName 我是说, tableReference.tableId 等),或只是试图 get 它并处理相关的错误(如果它不存在)。如果您的唯一目标是删除它,如果存在的话,您的尝试/捕获方法是最简单的。根据API文件 table#delete ,如果成功,则得到空响应。


    应用程序脚本使用示例 BigQuery.Tables.list 方法,它使用 partial responses 也就是说 "fields" 可选参数:

    function getAllTables(projectId, datasetId) {
      const options = {
        fields: "nextPageToken,tables(id,friendlyName,tableReference/tableId)"
      }
    
      // Collect all tables - there may be more than one page's worth!
      const tables = [];
      do {
        var search = BigQuery.Tables.list(projectId, datasetId, options);
        options.pageToken = search.nextPageToken;
        if (search.tables && search.tables.length)
          Array.prototype.push.apply(tables, search.tables);
      } while (options.pageToken);
    
      return tables;
    }
    

    重命名方式示例 patch :

    function renameTable(newName, projectId, datasetId, tableId) {
      // The fields and associated new values we're setting.
      const resource = {"friendlyName": newName};
      var response = BigQuery.Tables.patch(resource, projectId, datasetId, tableId);
      // Log the updated table metadata in Stackdriver.
      console.log(response);
    }
    

    (如果您使用 update ,您需要提供所需的全部表,而不仅仅是要更改的内容。)