使用节点 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:关于使用 nodejs 删除和更新行的问题
如何安全地为 bigquery 节点插入转义用户输入?可以在 bigquery.insert 节点库上使用参数化查询吗?