Я веду базу данных транзакций записей, которые периодически меняют данные.
у меня есть 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 или хранимая процедура содержит ошибку, из которой я получаю данные.
Извините за этот длинный пост, я новичок в узле и переполнение стека.
любая помощь приветствуется.