首先,启动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 ;");
或者从我的代码库下载:https://codechina.csdn.net/geeklevin/nodejs-api-006-db
重点函数解析
runSql(上面代码中对SQL语句执行的包装),使用了全局counter变量,并允许用户调用端提供一个回调函数。
比如代码最后执行‘SELECT 1; ', 执行回调关闭数据库连接。
数据库连接用完,必须进行管理,如果不适当关闭回导致数据库服务器端连接过多而拒绝新的数据库连接,影响其他实例,这里不做细讲。
执行node db.js 运行效果
第六条语句:查找到3条记录,并输出Alibaba,Tencent,XiaoMi 三个公司信息及股票价格等。
结果分析
从上面截图看,runSql函数顺序执行,可是SQL执行结果(result)对象是不同时输出(异步)的。
所以在设计runSql函数的时候,加入了counter计数器,这样可以根据输出,对应找到相应的下标(比如第六条SELECT SQL)结果。
本文的db.js不作为生产环境使用,仅供普通开发者参考,学习NodeJS连接数据库,具体的数据库SQL语句,读者可自行查找学习。
引用: