Как я могу вызвать google-bigquery delete и вставлять API синхронно? - PullRequest
0 голосов
/ 11 января 2019

Я веду базу данных транзакций записей, которые периодически меняют данные.

у меня есть cron, работающий каждые полчаса извлечение последних транзакций из основной базы данных и подача в мое приложение экспресс-узла (я довольно новичок в узле), я удаляю старые транзакции, которые соответствуют входящим транзакциям сначала номер заказа, затем вставьте последний номер в большую таблицу запросов.

после запуска приложения в течение дня я получаю дубликаты транзакций в моей базе данных. даже после проверки логов я не вижу, как удалить api не удалось нигде не знаю, как и откуда дубликаты.

Я использую @google-cloud/bigquery: ^2.0.2, я удаляю и вставляю данные в таблицы больших запросов, используя query api.

Я пытался использовать потоковые вставки, но это не позволит мне удалить недавно вставленные строки до 90 минут , что не будет работать в моем случае.

Мой index.js
let orderNumbers = '';

                    rows.map(function (value) {
                        orderNumbers += "'" + value.Order_Number+ "',";
                    });

                    orderNumbers = orderNumbers.slice(0, -1);

                    await functions.deleteAllWhere('Order_Number', orderNumbers);

                        let chunkedRowsArray = _.chunk(rows, CONSTANTS.chunkSize);


                        let arrSize = chunkedRowsArray.length;
                        for (var i = 0; i < arrSize; i++) {
                            let insertString = '';

                            chunkedRowsArray[i].forEach(element => {
                                let values = '(';
                                Object.keys(element).forEach(function (key) {
                                    if (typeof element[key] == 'string') {
                                        values += '"' + element[key] + '",';
                                    } else {
                                        values += element[key] + ",";
                                    }
                                });
                                values = values.slice(0, -1);
                                values += '),';
                                insertString += values;
                            });
                            insertString = insertString.slice(0, -1);

                            let rs = await functions.bulkInsert(insertString,i);
                        }

удалить вызов функции

await functions.deleteAllWhere('Order_Number', orderNumbers);

module.exports.deleteAllWhere = async (conditionKey, params) => {

const DELETEQUERY = `
DELETE FROM
\`${URI}\` 
WHERE ${conditionKey}
IN
(${params})`;

const options = {
    query: DELETEQUERY,
    timeoutMs: 300000,
    useLegacySql: false, // Use standard SQL syntax for queries.
};

// // Runs the query
return await bigquery.query(options);
};

аналогично построению запроса на вставку со значениями на порцию 200 в функции вставки.

Мне нужно написать программу синхронного узла, которая сначала удаляет несколько строк, а после успешного удаления строк вставляет новые.

Я понятия не имею, вызвано ли это асинхронной природой кода или что-то не так с bigquery или хранимая процедура содержит ошибку, из которой я получаю данные.

Извините за этот длинный пост, я новичок в узле и переполнение стека.

любая помощь приветствуется.

1 Ответ

0 голосов
/ 11 января 2019

Что касается интеграции BigQuery, вы должны сконструировать поток данных таким образом, чтобы каждая новая строка в таблице BigQuery была включена. Затем получите запросы, которые возвращают только самую новую строку, что легко сделать, если у вас есть поле для упорядочения по самой последней строке.

Вы можете запланировать запросы BigQuery, которые поддерживают материализованную таблицу этих данных очистки. Таким образом, в итоге вы получите две таблицы, одну из которых вы перетекаете во все строки, а другая материализуется, чтобы сохранить только самые новые.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...