#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:
Я обнаружил, что другой исходный код (некоторый код реакции в интерфейсе) вызывает эту проблему. Я закрою этот вопрос.