node連接mysql查詢(xún)事務(wù)處理的實(shí)現(xiàn)
自己用 mysql 很多次的,然后又是主玩nodejs的.專(zhuān)門(mén)寫(xiě)一篇文章來(lái)說(shuō)說(shuō)nodejs
連接mysql
數(shù)據(jù)庫(kù)。在使用之前,請(qǐng)檢查計(jì)算機(jī)是否具有一下環(huán)境!
- nodejs 執(zhí)行環(huán)境。
- mysql數(shù)據(jù)庫(kù)環(huán)境(下載地址)。
- navicat 連接 mysql 數(shù)據(jù)庫(kù)的圖形化操作軟件。(非必要)
進(jìn)入正題 mysql 增刪改查
首先,我們?nèi)ハ螺d一個(gè)叫mysql的依賴(lài)包,這個(gè)包就是通過(guò) nodejs 代碼去連接數(shù)據(jù)庫(kù),從而操作數(shù)據(jù)庫(kù)。
創(chuàng)建一個(gè)文件夾,快速生成pakeage.json
文件
D:\nodejs_mysql>npm init -y # 快速傳創(chuàng)建包管理文件
安裝依賴(lài)
D:\nodejs_mysql>npm i mysql -D # 安裝mysql 依賴(lài)包
創(chuàng)建一個(gè) index.js
文件,代碼如下
const mysql = require("mysql"); // 創(chuàng)建 一個(gè)mysql 連接池 const pool = mysql.createPool({ host: "127.0.0.1", // 連接數(shù)據(jù)庫(kù)的地址 127.0.0.1 為本地的mysql user: "root", // 連接數(shù)據(jù)庫(kù)的用戶(hù)名 root 是最高權(quán)限 password: "", // 連接數(shù)據(jù)庫(kù)的密碼 database: "apm", // 操作的數(shù)據(jù)庫(kù)名 port: "3306", // 連接mysql的端口號(hào) multipleStatements: true, // 運(yùn)行一次執(zhí)行多條sql語(yǔ)句 可以忽略此項(xiàng) }); function select() { // 請(qǐng)求連接mysql pool.getConnection((err, connection) => { // 未連接成功 報(bào)錯(cuò) if (err) throw err; // 得到一個(gè) 連接對(duì)象 調(diào)用 query 方法 可以執(zhí)行 sql 語(yǔ)句 let sql = "select * from goods"; // 運(yùn)行sql語(yǔ)句 query 第二個(gè)參數(shù)為 sql語(yǔ)句需要的參數(shù) ,沒(méi)有可以不寫(xiě) connection.query(sql, (errors, results, fields) => { // 釋放連接 connection.release(); // 如果運(yùn)行sql語(yǔ)句有報(bào)錯(cuò) 拋出錯(cuò)誤 if (errors) throw errors; console.log(results); console.log(fields); }); }); } select();
以上的代碼是查詢(xún) 數(shù)據(jù)庫(kù)apm
一個(gè)數(shù)據(jù)表goods
的數(shù)據(jù)。results
為從數(shù)據(jù)庫(kù)取出的數(shù)據(jù)。
封裝方法 使用Promise
來(lái)查詢(xún)數(shù)據(jù)庫(kù)
// index.js // ... 忽略前面的創(chuàng)建mysql連接池代碼 function query(sql, params) { return new Promise((resolve, reject) => { pool.getConnection((err, connection) => { // 未連接成功 報(bào)錯(cuò) if (err) return reject(err); // 得到一個(gè) 連接對(duì)象 調(diào)用 query 方法 可以執(zhí)行 sql 語(yǔ)句 // 運(yùn)行sql語(yǔ)句 query 第二個(gè)參數(shù)為 sql語(yǔ)句需要的參數(shù) ,沒(méi)有可以不寫(xiě) connection.query(sql, params, (errors, results, fields) => { // 釋放連接 connection.release(); // 如果運(yùn)行sql語(yǔ)句有報(bào)錯(cuò) 拋出錯(cuò)誤 if (errors) return reject(errors); resolve(results); }); }); }); } query("select * from goods", null).then((result) => { console.log(result); }); module.exports = { query, };
使用
// data.js const index = require("./index.js"); var sql = "select * from goods"; index .query(sql, null) .then((result) => { // do anything .... }) .catch((err) => { // error console.log(err); });
這樣就向外暴露了一個(gè)數(shù)據(jù)庫(kù)運(yùn)行 sql 的接口。通過(guò)promise
使用.then
這種鏈?zhǔn)秸{(diào)用的代碼風(fēng)格。
mysql 事務(wù)處理
說(shuō)到 mysql 事務(wù),我也就不做過(guò)多介紹了,這里給個(gè)友情鏈接方便大家學(xué)習(xí)。MySQL 事務(wù)處理
我們直接步入正題,使用promise
來(lái)封裝 mysql 的事務(wù)處理
.
// index.js // .... 部分創(chuàng)建 pool 的代碼 /** * mysql 事務(wù)處理 * @param {Array} sqls 需要執(zhí)行的sql語(yǔ)句 * @param {Array} params 對(duì)應(yīng)上面sql語(yǔ)句的參數(shù) * @returns {Promise} 返回一個(gè)Promise */ function transaction(sqls, params) { return new Promise((resolve, reject) => { pool.getConnection(function (err, connection) { // 連接失敗 promise直接返回失敗 if (err) { return reject(err); } // 如果 語(yǔ)句和參數(shù)數(shù)量不匹配 promise直接返回失敗 if (sqls.length !== params.length) { connection.release(); // 釋放掉 return reject(new Error("語(yǔ)句與傳值不匹配")); } // 開(kāi)始執(zhí)行事務(wù) connection.beginTransaction((beginErr) => { // 創(chuàng)建事務(wù)失敗 if (beginErr) { connection.release(); return reject(beginErr); } console.log("開(kāi)始執(zhí)行事務(wù),共執(zhí)行" + sqls.length + "條語(yǔ)句"); // 返回一個(gè)promise 數(shù)組 let funcAry = sqls.map((sql, index) => { return new Promise((sqlResolve, sqlReject) => { const data = params[index]; connection.query(sql, data, (sqlErr, result) => { if (sqlErr) { return sqlResolve(sqlErr); } sqlReject(result); }); }); }); // 使用all 方法 對(duì)里面的每個(gè)promise執(zhí)行的狀態(tài) 檢查 Promise.all(funcAry) .then((arrResult) => { // 若每個(gè)sql語(yǔ)句都執(zhí)行成功了 才會(huì)走到這里 在這里需要提交事務(wù),前面的sql執(zhí)行才會(huì)生效 // 提交事務(wù) connection.commit(function (commitErr, info) { if (commitErr) { // 提交事務(wù)失敗了 console.log("提交事務(wù)失敗:" + commitErr); // 事務(wù)回滾,之前運(yùn)行的sql語(yǔ)句不生效 connection.rollback(function (err) { if (err) console.log("回滾失?。? + err); connection.release(); }); // 返回promise失敗狀態(tài) return reject(commitErr); } connection.release(); // 事務(wù)成功 返回 每個(gè)sql運(yùn)行的結(jié)果 是個(gè)數(shù)組結(jié)構(gòu) resolve(arrResult); }); }) .catch((error) => { // 多條sql語(yǔ)句執(zhí)行中 其中有一條報(bào)錯(cuò) 直接回滾 connection.rollback(function () { console.log("sql運(yùn)行失?。?" + error); connection.release(); reject(error); }); }); }); }); }); } module.exports = { transaction, };
之后只需要調(diào)用這個(gè)方法就可以執(zhí)行 mysql 事務(wù)了
// data.js const index = require("./index.js"); var sqls = [ "delete from goods where goods_id = ?", // 刪除 語(yǔ)句 "update goods set num = ? where goods_id = ?;", // 更新語(yǔ)句 ]; var params = [ [1], // parmas 是數(shù)組格式 與sqls里的sql語(yǔ)句里 ? 一一對(duì)應(yīng) [5, 3], ]; index .transaction(sqls, params) .then((arrResult) => { // do anything .... }) .catch((err) => { // error console.log(err); });
到此這篇關(guān)于node連接mysql查詢(xún)事務(wù)處理的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)node連接mysql查詢(xún)事務(wù)處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Vue項(xiàng)目通過(guò)node連接MySQL數(shù)據(jù)庫(kù)并實(shí)現(xiàn)增刪改查操作的過(guò)程詳解
- Node-Red實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)連接的方法
- node+express框架中連接使用mysql(經(jīng)驗(yàn)總結(jié))
- nodejs連接mysql數(shù)據(jù)庫(kù)及基本知識(shí)點(diǎn)詳解
- Node.js使用MySQL連接池的方法實(shí)例
- nodejs實(shí)現(xiàn)的連接MySQL數(shù)據(jù)庫(kù)功能示例
- node 多種方法連接mysql數(shù)據(jù)庫(kù)(最新推薦)
相關(guān)文章
node.js文件的復(fù)制、創(chuàng)建文件夾等相關(guān)操作
這篇文章主要給大家介紹了node.js文件的復(fù)制、創(chuàng)建文件夾等相關(guān)操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02node基于async/await對(duì)mysql進(jìn)行封裝
這篇文章主要介紹了node基于async/await對(duì)mysql進(jìn)行封裝,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下2019-06-06node.js在Linux下執(zhí)行shell命令、.sh腳本的問(wèn)題
很多時(shí)候需要多個(gè)命令來(lái)完成一項(xiàng)工作,而這個(gè)工作又常常是重復(fù)的,這個(gè)時(shí)候我們自然會(huì)想到將這些命令寫(xiě)成sh腳本,下次執(zhí)行下這個(gè)腳本一切就都搞定了,下面就是發(fā)布代碼的一個(gè)腳本示例2022-01-01Node.js 使用axios讀寫(xiě)influxDB的方法示例
這篇文章主要介紹了Node.js 使用axios讀寫(xiě)influxDB的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-10-10Linux CentOS系統(tǒng)下安裝node.js與express的方法
這篇文章主要給大家介紹了在Linux CentOS系統(tǒng)下安裝node.js與express的方法,文中介紹的非常詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-04-04node.js中fs文件系統(tǒng)目錄操作與文件信息操作
本篇文章給大家詳細(xì)分析了node.js中fs文件系統(tǒng)目錄操作與文件信息操作的方法以及代碼詳解,需要的讀者可以參考下。2018-02-02Node.js定時(shí)任務(wù)之node-schedule使用詳解
這篇文章主要介紹了Node.js定時(shí)任務(wù)之node-schedule使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08Node.js如何響應(yīng)Ajax的POST請(qǐng)求并且保存為JSON文件詳解
這篇文章主要介紹了關(guān)于Node.js是如何響應(yīng)Ajax的POST請(qǐng)求并且保存為JSON文件的相關(guān)資料,文中介紹的很詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-03-03