Sha*_*ria 6 mysql stored-procedures node.js sequelize.js
我们正在使用nodejs构建一个应用程序,使用sequelize构建一个mysql应用程序。Sequelize 使处理数据库时的开发变得更加容易。不错的概念。我需要你在 Sequelize 方面的帮助。我们在使用 Sequelize 和 MySQL 数据库进行软件开发方面已经取得了很大的进展。我们在 MySQL 中构建了许多存储过程,用于处理复杂的业务计算/逻辑。
我们在处理包含临时表数据的存储过程和续集时遇到以下两个问题。
情况1:
我创建了一个存储过程,它从临时表返回数据。存储过程正在创建临时表(如果不存在)。
CREATE PROCEDURE `Sproc_GetCountryList` ()
BEGIN
Drop temporary table if exists tempCountry;
Create temporary table if not exists tempCountry
select countryID, countryName, countrySortCode
from countrymst;
END
Run Code Online (Sandbox Code Playgroud)
现在,当我使用sequelize 和transaction 调用它时(请参阅下面的最小示例代码),它会立即从 UI 的后续调用中返回重复数据。但是当我在调用中保持几秒的差异(例如大约 10 秒)时,它会返回正确的结果。
getCountryList: (req, res) => {
const {
sequelize
} = req.app.locals.models;
return sequelize.transaction().the(t) => {
return sequelize.query('CALL Sproc_GetCountryList ()', {
type: sequelize.QueryTypes.SELECT,
transaction: t
}).then((response) => {
t.commit();
return resHandler.successRes(res, 200, STATE.SUCCESS, _.values(_.first(response)));
}).catch(function (err) {
t.rollback();
});
}).catch(function (err) {
t.rollback();
});
},
Run Code Online (Sandbox Code Playgroud)
每个存储过程包含一个或两个临时表,并且根据 MySQL,临时表范围仅限于每个会话。因此,具有不同会话的用户将拥有多个临时表,但具有自己的临时数据集。(参考https://www.oreilly.com/library/view/mysql-cookbook-2nd/059652708X/ch04s04.html)您有什么建议我如何使用sequelize处理会话,以便它始终返回唯一的数据在随后的通话中。
案例2:
我创建了一个存储过程,它从临时表返回数据。如果临时表不存在,存储过程将创建临时表,并在存储过程结束时删除临时表。
CREATE PROCEDURE `Sproc_GetCountryList` ()
BEGIN
Create temporary table if not exists tempCountry
select countryID, countryName, countrySortCode
from countrymst;
Drop temporary table tempCountry;
END
Run Code Online (Sandbox Code Playgroud)
现在,当我使用sequelize调用它时(请参阅下面的最小示例代码),立即从UI进行后续调用,并返回错误,例如列“countryName”未定义。
getCountryList: (req, res) => {
const {
sequelize
} = req.app.locals.models;
sequelize.query('CALL Sproc_GetCountryList ()', {
type: sequelize.QueryTypes.SELECT
}).then((response) => {
return resHandler.successRes(res, 200, STATE.SUCCESS, _.values(_.first(response)));
}).catch(function (err) {
console.trace();
});
},
Run Code Online (Sandbox Code Playgroud)
您能分享一下您的想法,以防止这种情况发生吗?