Упорядочить — Как вставить данные, а затем обновить

#node.js #orm #mariadb #sequelize.js

Вопрос:

Я использую Sequalize ORM для проекта node.js/maria db.

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

Последовательность моей логики изложена ниже.

Шаг 1. Уничтожьте таблицу, чтобы сбросить данные.

Шаг 2. Вставьте данные о продукте.

Шаг 3. Обновите данные о ценах в данных о продукте.

Шаг 4. Обновите данные о запасах в данных о продукте.

Проблема заключается в шаге 3 и 4. Это не работает! Вот что я обнаружил… «Вставка» заняла некоторое время, чтобы закончить. Итак, «Обновление» не удалось выполнить, потому что пока нет данных о продукте.

Есть ли какая-либо идея вызвать шаг 3~4, вскоре после завершения шага 2?

Заранее спасибо.

 const generateProductList = () => {

    return new Promise( async (resolve, reject) => {

        try {

            await ProductPresentation.destroy({ truncate: true })

            const productSql = `INSERT INTO m_product_presentation (productId, sku, name, status, urlKey, category, shortDescription, imageSmall, imageThumbnail) 
            SELECT id, sku, name, status, urlKey, category, shortDescription, imageSmall, imageThumbnail FROM m_product;`

            const priceSql = `UPDATE m_product_presentation INNER JOIN m_price
            ON m_product_presentation.productId = m_price.productId
            SET m_product_presentation.priceRrp = m_price.priceRrp, m_product_presentation.priceRegular = m_price.priceRegular, m_product_presentation.priceSpecial = m_price.priceSpecial;`

            const stockSql = `UPDATE m_product_presentation INNER JOIN m_inventory
            ON m_product_presentation.productId = m_inventory.productId
            SET m_product_presentation.stockAvailability = m_inventory.stockAvailability, m_product_presentation.stockQty = m_inventory.stockQty;`


            // What I want is, Create initial data first. And then, update price and stock info. But, It fail...
            await ProductPresentation.sequelize.query(productSql, { type: QueryTypes.INSERT })
            await ProductPresentation.sequelize.query(priceSql, { type: QueryTypes.UPDATE })
            await ProductPresentation.sequelize.query(stockSql, { type: QueryTypes.UPDATE })

            resolve()

        } catch(err) {

            reject(err)
            logger.error(err)

        }

    })
}

 

Комментарии:

1. Почему бы вам не вставить его в первый раз с обновленным запасом и обновленной ценой? Зачем запускать запрос, связанный с одним и тем же продуктом, несколько раз в одном и том же обработчике?

Ответ №1:

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

 const generateProductList = () => {
  return new Promise(async (resolve, reject) => {
    try {
      await ProductPresentation.destroy({ truncate: true })
      const productSql = `INSERT INTO m_product_presentation (productId, sku, name, status, urlKey, category, shortDescription, imageSmall, imageThumbnail) 
            SELECT id, sku, name, status, urlKey, category, shortDescription, imageSmall, imageThumbnail FROM m_product;`
      const priceSql = `UPDATE m_product_presentation INNER JOIN m_price
            ON m_product_presentation.productId = m_price.productId
            SET m_product_presentation.priceRrp = m_price.priceRrp, m_product_presentation.priceRegular = m_price.priceRegular, m_product_presentation.priceSpecial = m_price.priceSpecial;`
      const stockSql = `UPDATE m_product_presentation INNER JOIN m_inventory
            ON m_product_presentation.productId = m_inventory.productId
            SET m_product_presentation.stockAvailability = m_inventory.stockAvailability, m_product_presentation.stockQty = m_inventory.stockQty;`

      // Inserting the product in the table
      const product = await ProductPresentation.sequelize.query(productSql, { type: QueryTypes.INSERT })
      // To find if the product is existing the table or not
      const isProductEntered = await sequelize.query(`
      select exists(select 1 from "m_product_presentation" where "productId"=$1)
      `, {
        bind: [`${product[0][0].productId}`],
        type: QueryTypes.SELECT
      });
      if (isProductEntered[0].exists) {
        await ProductPresentation.sequelize.query(priceSql, { type: QueryTypes.UPDATE })
        await ProductPresentation.sequelize.query(stockSql, { type: QueryTypes.UPDATE })
      }
      
      resolve()

    } catch (err) {
      reject(err)
      logger.error(err)
    }
  })
}

 

Если продукт будет введен только после этого, будут выполнены запросы на обновление.

Комментарии:

1. Спасибо за вашего доброго гида. Но.. Я обнаружил, что основной причиной был другой исходный код. Так что я успешно это исправил. 🙂

Ответ №2:

Я обнаружил, что другой исходный код (некоторый код реакции в интерфейсе) вызывает эту проблему. Я закрою этот вопрос.