NodeJS 后端开发 06 连接MySQL

举报
雷学委 发表于 2021/12/19 19:08:29 2021/12/19
【摘要】 ​ 好久没分享了,今天分享一个NodeJS连接MySQL数据库的JS库:db.js 首先,启动MySQL服务器并准备数据库Profile(下图为MacBook 单机版MySQL Server)​数据库Profile信息包含:目标数据库服务器IP,端口,用户账户和密码,还有目标数据库名称。编写连接数据库的JS函数将下面内容复制到db.js文件const mysql = require('my...

 好久没分享了,今天分享一个NodeJS连接MySQL数据库的JS库:db.js

 

首先,启动MySQL服务器并准备数据库Profile

(下图为MacBook 单机版MySQL Server)

数据库Profile信息包含:目标数据库服务器IP,端口,用户账户和密码,还有目标数据库名称。

编写连接数据库的JS函数

将下面内容复制到db.js文件

const mysql =  require('mysql');

//创建一个数据库连接
const db =  mysql.createConnection({
    host: "localhost",
    port: 3306,
    user: "root",
    password: "12345678"
});

const logDbStat = function(){
    console.log("db state %s and threadID %s", db.state, db.threadId);
    // console.log("db detail:", db);
}

//在此时,仍旧未有实际连接到数据库
logDbStat();

console.log('start to connect mysql');
db.connect(function(err){
    if(err){
        console.log('fail to connect db',err.stack);
        throw err;
    }
    // 这里正真连接上数据库了。
    logDbStat();
});

const close = function(){
    db.destroy();
    console.log('db disconnected');
    logDbStat();
};

//定义一个计数器和runSql函数
//作用是跟踪输入的SQL与输出结果,也对数据库操作做一个简单包装。
var counter = 0;
const runSql = function(sql, callback){
    counter++;
    var cv = counter;
    console.log('run sql[%s] :[%s]',cv, sql);
    db.query(sql, function(error, result, fields){
        try{
            if(error) throw error;
            console.log('[%s] result:', cv, result); // use cv instead of counter, as counter is part of 'global', it will be polluted
        }finally{
            if(callback) callback(result, fields);
        }
    });
}

// 执行SQL语句
const myDb = 'demo20210330';

runSql("CREATE DATABASE IF NOT EXISTS " + myDb 
	+ " DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ; ");


runSql("USE " + myDb);

//创建公司数据表
runSql("CREATE TABLE IF NOT EXISTS COMPANY ( "
	+ " ID int(11) NOT NULL AUTO_INCREMENT,    "
	+ " NAME varchar(64) NOT NULL UNIQUE, "
	+ " AGE int(8) NOT NULL, "
	+ " ADDRESS text DEFAULT NULL, "
	+ " STOCK_PRICE decimal(10,3) DEFAULT NULL, "
    + "  PRIMARY KEY (ID) "
    + " ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8; ");


runSql("TRUNCATE TABLE COMPANY ;");

//插入三条公司股价信息
runSql(" INSERT INTO COMPANY "
	+ "(NAME, AGE, ADDRESS, STOCK_PRICE ) VALUES "
    + "('Alibaba', 21, 'Hangzhou', 230.35), "
    + "('Tencent', 31, 'Shenzhen', 610.00), "
    + "('XiaoMi', 10, 'Beijing', 25.05) ; ");

// 查询所有公司股票信息和地址等
const querySql = "SELECT * FROM COMPANY ;";

runSql(querySql, function(result,fields){
    console.log('query result:', result);
});


/**
db.query(querySql, function(err, rows){
    if(err){
        console.log('error ' + err);
        throw err;
    }
    console.log('query output=');
    console.log(rows);
});
*/

// close(); // don't close here as the query function may not completed.
runSql("SELECT 1 ; ", function(result, fields){
    close();
});

// runSql(" DELETE FROM COMPANY ;");

或者从我的代码库下载:雷学委 / nodejs-api-006-db · GIT CODE

重点函数解析

runSql(上面代码中对SQL语句执行的包装),使用了全局counter变量,并允许用户调用端提供一个回调函数。

比如代码最后执行‘SELECT 1; ', 执行回调关闭数据库连接。

数据库连接用完,必须进行管理,如果不适当关闭回导致数据库服务器端连接过多而拒绝新的数据库连接,影响其他实例,这里不做细讲。

执行node db.js 运行效果

第六条语句:查找到3条记录,并输出Alibaba,Tencent,XiaoMi 三个公司信息及股票价格等。

结果分析

从上面截图看,runSql函数顺序执行,可是SQL执行结果(result)对象是不同时输出(异步)的。

所以在设计runSql函数的时候,加入了counter计数器,这样可以根据输出,对应找到相应的下标(比如第六条SELECT SQL)结果。

本文的db.js不作为生产环境使用,仅供普通开发者参考,学习NodeJS连接数据库,具体的数据库SQL语句,读者可自行查找学习。


引用:

mysql - npm

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。