使用节点 js 在 BigQuery 中更新数据

Posted

技术标签:

【中文标题】使用节点 js 在 BigQuery 中更新数据【英文标题】:UPDATE data in BigQuery using node js 【发布时间】: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

【问题讨论】:

【参考方案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);

【讨论】:

以上是关于使用节点 js 在 BigQuery 中更新数据的主要内容,如果未能解决你的问题,请参考以下文章

Bigquery如何从数据流中删除记录

BigQuery:关于使用 nodejs 删除和更新行的问题

在 bigquery 中更新表

如何安全地为 bigquery 节点插入转义用户输入?可以在 bigquery.insert 节点库上使用参数化查询吗?

BigQuery - DataWarehouse 的维度表设计?

使用来自 Bigquery 的新数据更新 Data Studio