【问题标题】:Google Apps Script - check if table exist, delete it if it does exist, check if the delete job finishedGoogle Apps 脚本 - 检查表是否存在,如果存在则将其删除,检查删除作业是否完成
【发布时间】:2018-07-19 23:45:16
【问题描述】:

我正在尝试查找 Google Apps 脚本 -> 高级服务 -> BigQuery 的完整参考资料。 Apps Script BigQuery reference 只给出了一些样本,没有涵盖所有的方法。
我们应该检查方法参数的 API 引用。

这是我想做的事

  1. 检查表是否存在
  2. 如果存在则删除
  3. 检查删除作业是否完成

检查表是否存在

如果存在则删除

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

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 方法没有返回任何东西?如何知道删除作业是否完成?

【问题讨论】:

  • 为什么不使用DROP TABLE IF EXISTS 声明?
  • 但问题很可能会保持不变 - “我怎么知道删除作业是否完成?” :o)

标签: google-apps-script google-bigquery


【解决方案1】:

如文档中所述,“高级服务”只是相关 Google API 的包装器。因此,您不会在 Apps Script 中找到有关高级服务的文档,因为这些方法在相应的 API 页面上有详尽的详细说明。您可以使用编辑器内自动完成来确定方法签名,或关注Google's tips

您可以通过listing all tables in your project & dataset 确定表是否存在,然后检查相关属性(idfriendlyNametableReference.tableId 等),或者直接尝试get 并处理相关错误(如果它不存在)。如果您的唯一目标是在它存在时将其删除,那么您的 try/catch 方法是最简单的。根据table#delete 的 API 文档,如果成功,您会得到一个空响应。


一个使用 BigQuery.Tables.list 方法的示例 Apps 脚本,该方法使用 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,则需要提供所需的完整表格,而不仅仅是您要更改的表格。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 2021-02-16
    • 2022-06-16
    • 2017-10-01
    • 2011-09-17
    相关资源
    最近更新 更多