Node JS Проблема с массовой вставкой Maria DB - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь выполнить массовую вставку продуктов в базу данных, похоже, он работает, так как не вызывает никаких ошибок, а только вставляет первый массив значений из массива. Когда я проверяю console.log, массив возвращает несколько массивов, но вставляется только один. Есть идеи, откуда это могло взяться? Заранее большое спасибо!

const pool = mariadb.createPool({
     ...
     multipleStatements: true
});
var conn = pool.getConnection();

var matchedProducts = [];
for (var ptm_i = 0; ptm_i < products_to_match.length; ptm_i++) {

                                value_to_add = products_to_match[ptm_i]['suid'];
                                var final_price = products_to_match[ptm_i]['finalprice']/100;
                                var initial_price = products_to_match[ptm_i]['price']/100;
                                var isOnSale = products_to_match[ptm_i]['onsale'];
                                var sizes = unique_id_sizes[value_to_add].join(',');
                                var store_details = [
                                    products_to_match[ptm_i]['product_id'],
                                    partner_id,
                                    final_price,
                                    initial_price,
                                    isOnSale,
                                    'USD',
                                    sizes,
                                    value_to_add,
                                    products_to_match[ptm_i]['id'],
                                    products_to_match[ptm_i]['url']
                                ];
                                matchedProducts.push(store_details);
                            }       
                            //console.log(matchedProducts);
                            try{                    
                                let matched_query = 'INSERT INTO stores (product_id, partner_id, price, initial_price, is_on_sale, currency, sizes, merchant_code, origin_id, link) VALUES ?';
                                conn.query(matched_query, matchedProducts, (error, result) => {
                                    //console.log(result);
                                });

                            }catch(err){
                                console.log(err)
                                throw err;
                            }
}

1 Ответ

2 голосов
/ 18 июня 2020

Я предполагаю, что вы используете здесь разъем mariadb.

Для пакетной вставки вы используете:

connection.batch(sql, values) → Promise: fast batch processing.

not

connection.query(sql[, values]) → Promise: Executes a query.

Вы можете найти документацию здесь .

Вот пример:

// https://github.com/mariadb-corporation/mariadb-connector-nodejs/blob/master/documentation/batch.md
connection.beginTransaction();
connection.query("INSERT INTO BASKET(customerId) values (?)", [1], (err, res) => {
  //must handle error if any
  const basketId = res.insertId;
  try {
    connection.batch("INSERT INTO basket_item(basketId, itemId) VALUES (?, ?)",[
        [basketId, 100],
        [basketId, 101],
        [basketId, 103],
        [basketId, 104],
        [basketId, 105]
    ]);
    //must handle error if any
    connection.commit();
  } catch (err) {
    connection.rollback();
    //handle error
  }
});
...