mysql是Nodejs下比较有名的一个MySQL操作模块。
下面是一个简单的创建mysql数据库的连接
var conn = mysql.createConnection({
host: settings.host,
user: settings.user,
password: settings.password,
database: settings.database,
port: settings.port
});
conn.connect();
然后可以通过conn来执行查询操作
var sql = 'select * from test';
conn.query(sql, function(err, rows) {
if (err) throw err;
console.log(rows);
});
也可以执行更新和插入操作
sql = 'insert into ?test(name) value ("张三")';
conn.query(sql, [table,name] ,function(err, info) {
if (err) throw err;
console.log(info.affectedRows);
console.log(info.insertId);
});
这里的affectedRows是操作后表受影响的行数,可以用来判断是否更新或操作成功
insertId可以得到插入记录的自增ID
最后需要关闭连接
conn.end();
如果网络问题或者MySQL服务器重启或者超过一段时间没操作,MySQL会主动断开连接,这是需要监听这个事件,重新连接数据库
function handleDisconnect() {
conn = mysql.createConnection({
host: settings.host,
user: settings.user,
password: settings.password,
database: settings.database,
port: settings.port
});
conn.connect(function(err) {
if (err) {
console.log('连接数据库出错:' + err);
setTimeout(handleDisconnect, 2000);
}
});
conn.on('error',function(err){
console.log('出错:'+err);
if(err.code == 'PROTOCOL_CONNECTION_LOST'){
handleDisconnect();
}else{
throw err;
}
});
}
handleDisconnect();
为了防止遭受SQL注入攻击,可以对标识符和字符串进行转义操作
var colunms = ['id','name'];
var sql = 'select ?? from test';
conn.query(sql,[colunms], function(err, rows) {
if (err) throw err;
console.log(rows);
});
var name = '李四';
var table = 'test';
sql = 'insert into ??(name) value ("?")';
conn.query(sql, [table,name] ,function(err, info) {
if (err) throw err;
console.log(info.affectedRows);
console.log(info.insertId);
});
标识符用 ?? 或者 mysql.escapeID()
字符串用 ? 或者conn.escape()
实际应用中,往往需要同时发起多个数据库查询,如果只建立一个数据库连接,那查询就会进入等待队列,所以需要一个连接池来管理多个数据库的连接
var pool = mysql.createPool({
host: settings.host,
user: settings.user,
password: settings.password,
database: settings.database,
port: settings.port,
connectionLimit: 10
});
pool.getConnection(function(err,connection){
if(err) throw err;
// connection 为当前一个可用的数据库连接
});
connectionLimit 最大连接数,默认为10