#javascript #sql #node.js #google-bigquery #sql-update
#javascript #sql #node.js #google-большой запрос #sql-обновление
Вопрос:
Возможно ли обновить данные в BigQuery с помощью одной инструкции SQL?
Данные находятся в массиве, и каждый элемент должен обновлять одну строку в BigQuery.
Можно отправить всю информацию за один снимок или мне нужно обновлять строки одну за другой?
В BigQuery у меня есть эта таблица:
| userID | Level |
|--------|-------|
| 01 | 2 |
| 02 | 2 |
| 03 | 3 |
| 04 | 3 |
и в моем коде у меня есть этот массив:
[{
userID: 01,
newLevel: 5
},
{
userID: 02,
newLevel: 8
}
]
Итак, мне нужно ОБНОВИТЬ пользователей 01 и 02 с их новыми данными уровней.
вот мой код для выполнения запросов к BigQuery с использованием nodejs:
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 — смотрите упрощенный пример, с которого можно поиграть и начать
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:
Основываясь на ответе Михаила, вот как выглядит мой код в 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);
}