ОБНОВЛЕНИЕ данных в BigQuery с использованием node js

#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);
}