gpt4 book ai didi

mysql - 在 nodejs 中执行多个可靠的 mysql 查询

转载 作者:行者123 更新时间:2023-11-29 02:16:04 25 4
gpt4 key购买 nike

我正在做一个项目,在那里我必须为用户创建团队,但在此之前我需要检查该团队名称是否已被同一用户占用。下面是示例代码

 var mysql=require('../../config/mysql_connect.js');
var dateFormat = require('dateformat');

var functions={

createTeam:function(data,cb){

this.checkifExists(data,function(err,result){

if(err)
{
cb(err);
}
else
{
if(result.length)
{
cb(null,0); // Team name exists
}
else
{
mysql.getConnectionFromPool(function(err,con){

if(err)
{
cb(err);
}
else
{

var query=con.query("Insert into team SET ? ",data,function(err,result){

if(err)
{
cb(err);
}
else
{
cb(null,result.insertId);
}

con.release();
});

}
});
}
}
});


},
checkifExists:function(data,cb){

mysql.getConnectionFromPool(function(err,con){

if(err)
{
cb(err);
}
else
{
var sql="Select id from team where user_id = ? and team_name like "+ con.escape('%'+data.team_name+'%') ;

var query=con.query(sql,[data.user_id,data.team_name],function(err,result){

if(err)
{
cb(err);
}
else
{
cb(null,result);
}
con.release();
});

console.log(query.sql);
}

});
}
};

module.exports=functions;

一切正常,但有没有更简单的方法以更易于管理的方式编写这种可靠的查询,因为有时会有超过 3-4 个查询并且代码变得复杂且难以管理。

我知道同样的事情可以通过 mysql 唯一索引来实现,但是如果有超过 3-4 个查询并且在某些情况下索引不能满足我的需求,那该怎么办

最佳答案

据我所知,有两个问题。

  1. 您不能将事务与非托管池连接一起使用,因为为一个连接启动的事务无法传递给其他连接。
  2. 您为每个函数获取和释放连接。这是不必要的重复代码。

要解决这些问题,您可以通过实体使用单独的连接,例如team 的一个连接,user 的第二个连接等等。为避免回调 hell ,请使用 async 模块或 promises。

这是草稿

// db.js
var mysql=require('../../config/mysql_connect.js');
var connections = {};

// No, that code don't solve problems, because transaction can't started inside other.
// Block mechanism by transaction property `is_busy` seems a bulky.
function DB(name) {
if (!name)
// unnamed connection. Must be released on query end.
return mysql.getConnectionFromPool();

if (!connections[name])
// create always open connection
connections[name] = mysql.getConnectionFromPool();

return connections[name];
}

module.exports = DB;

// team.js
var dateFormat = require('dateformat');
var async = require('async');
var db = require('db')('team'); // get always-open connection for team-entity from pool

function create (data, cb) {
// Here async is not necessary but used as example
async.waterfall([
function(cb) {
isExists(data.user_id, data.team_name, cb);
},

function(isTeamExists, cb) {
if (!isTeamExists)
return cb(); // go to end of waterfall
// is a bad statement; use enum of fields
db.query('insert into team SET ?', data, cb);
}],

// end waterfall chain
function(err, team_id) {
if (err)
return cb(err); // pass error to original cb-func

...do-smth and call cb without error...
}
);
}

function isExists (user_id, team_name, cb) {
// You can use ?? to masked input
db.query('select 1 from team where user_id = ?? and team_name like "%??%"',
[user_id, team_name],
function(err, res) {
cb(err, !err && res.length > 0);
}
);
}

module.exports = {
create,
isExists
};

关于mysql - 在 nodejs 中执行多个可靠的 mysql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39435056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com