【问题标题】:UPDATE data in BigQuery using node js使用节点 js 在 BigQuery 中更新数据
【发布时间】:2020-09-10 22:25:17
【问题描述】:

是否可以通过一条 SQL 指令更新 BigQuery 中的数据?

数据在一个数组中,每个元素必须更新 BigQuery 中的一行。

可以一次性发送所有信息还是我必须逐行更新?

在 BigQuery 中我有这张表:

| userID | Level |
|--------|-------|
| 01     | 2     |
| 02     | 2     |
| 03     | 3     |
| 04     | 3     |

在我的代码中我有这个数组:

[{
userID: 01,
newLevel: 5
},
{
userID: 02,
newLevel: 8
}
]

所以我需要用他们的新关卡数据更新用户 01 和 02。

这是我使用 nodejs 对 BigQuery 执行查询的代码:

const customQuery = async (query) => {
    // Imports the Google Cloud client library

    /**
     * TODO(developer): Uncomment the following line before running the sample.
     */
    // const projectId = "your-project-id";
    //console.log("query " + query)
    // Modify this query however you need
    const sqlQuery = query;

    // Creates a client
    const bigquery = new BigQuery();

    // Query options list: https://cloud.google.com/bigquery/docs/reference/v2/jobs/query
    const options = {
        query: sqlQuery,
        timeoutMs: 100000, // Time out after 100 seconds.
        useLegacySql: false, // Use standard SQL syntax for queries.
    };

    // Runs the query
    try {
        var r = await bigquery.query(options);
        //console.log("r: ", r)
    } catch (err) {
        console.log(err)
    }

    return r
}

【问题讨论】:

    标签: javascript sql node.js google-bigquery sql-update


    【解决方案1】:

    是否可以一次性发送所有信息

    是的,您应该使用UPDATE statement - 请参阅简化示例供您开始使用

    CREATE TEMP TABLE mytable  AS (
      SELECT '01' userID, 2 Level UNION ALL
      SELECT '02', 2 UNION ALL
      SELECT '03', 3 UNION ALL
      SELECT '04', 3 
    );
    
    UPDATE mytable t 
    SET Level = newLevel
    FROM (
      SELECT '01' userID, 5 newLevel UNION ALL
      SELECT '02', 8 
    ) u
    WHERE t.userID = u.userID;
    
    SELECT * FROM mytable;  
    

    输出是

    Row userID  Level    
    1   02      8    
    2   01      5    
    3   03      3    
    4   04      3    
    

    【讨论】:

      【解决方案2】:

      根据 Mikhail 的回答,这是我在 nodejs 中的代码的样子。它有效!

          const updateRows = async (users) => {
          var query
          query = "UPDATE `mytable` t "
          query = query + "SET Level = newLevel "
          query = query + "FROM ( "
          users.forEach((u, index, array) => {
              if (index !== array.length - 1) {
                  query = query + " SELECT '" + u.userID + "' userID, " + u.newLevel + " newLevel UNION ALL"
              } else {
                  query = query + " SELECT '" + u.userID + "' userID, " + u.newLevel + " newLevel "
              }
          })
          query = query + ") u "
          query = query + "WHERE t.userID = u.userID "
      
          console.log(query)
      
          var updateResult = await bigquery.customQuery(query)
          console.log('updateResult :', updateResult);
      }
      

      【讨论】:

        猜你喜欢
        • 2019-09-15
        • 2020-02-06
        • 2016-05-08
        • 2017-09-20
        • 1970-01-01
        • 2016-10-12
        • 2018-01-29
        • 1970-01-01
        • 2018-03-19
        相关资源
        最近更新 更多