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