nodejs 連接 mysql 查詢事務處理


自己用 mysql 很多次的,然后又是主玩nodejs的.專門寫一篇文章來說說nodejs連接mysql數據庫。在使用之前,請檢查計算機是否具有一下環境!

  • nodejs 執行環境。
  • mysql數據庫環境(下載地址)。
  • navicat 連接 mysql 數據庫的圖形化操作軟件。(非必要)

檢查環境

進入正題 mysql 增刪改查

首先,我們去下載一個叫mysql的依賴包,這個包就是通過 nodejs 代碼去連接數據庫,從而操作數據庫。

  • 創建一個文件夾,快速生成pakeage.json文件
D:\nodejs_mysql>npm init -y  # 快速傳創建包管理文件
  • 安裝依賴
D:\nodejs_mysql>npm i mysql -D # 安裝mysql 依賴包
  • 創建一個 index.js 文件,代碼如下
const mysql = require("mysql");

// 創建 一個mysql 連接池
const pool = mysql.createPool({
  host: "127.0.0.1", // 連接數據庫的地址 127.0.0.1 為本地的mysql
  user: "root", //  連接數據庫的用戶名 root 是最高權限
  password: "", //  連接數據庫的密碼
  database: "apm", // 操作的數據庫名
  port: "3306", // 連接mysql的端口號
  multipleStatements: true, // 運行一次執行多條sql語句 可以忽略此項
});

function select() {
  // 請求連接mysql
  pool.getConnection((err, connection) => {
    // 未連接成功 報錯
    if (err) throw err;
    // 得到一個 連接對象 調用 query 方法 可以執行 sql 語句
    let sql = "select * from goods";
    // 運行sql語句 query 第二個參數為 sql語句需要的參數 ,沒有可以不寫
    connection.query(sql, (errors, results, fields) => {
      // 釋放連接
      connection.release();
      // 如果運行sql語句有報錯 拋出錯誤
      if (errors) throw errors;
      console.log(results);
      console.log(fields);
    });
  });
}

select();

以上的代碼是查詢 數據庫apm一個數據表goods的數據。results為從數據庫取出的數據。

  • 封裝方法 使用Promise來查詢數據庫
//  index.js
// ... 忽略前面的創建mysql連接池代碼
function query(sql, params) {
  return new Promise((resolve, reject) => {
    pool.getConnection((err, connection) => {
      // 未連接成功 報錯
      if (err) return reject(err);
      // 得到一個 連接對象 調用 query 方法 可以執行 sql 語句
      // 運行sql語句 query 第二個參數為 sql語句需要的參數 ,沒有可以不寫
      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);
  });

這樣就向外暴露了一個數據庫運行 sql 的接口。通過promise使用.then這種鏈式調用的代碼風格。

mysql 事務處理

說到 mysql 事務,我也就不做過多介紹了,這里給個友情鏈接方便大家學習。MySQL 事務處理

我們直接步入正題,使用promise來封裝 mysql 的事務處理.

// index.js

// .... 部分創建 pool 的代碼

/**
 * mysql 事務處理
 * @param {Array} sqls 需要執行的sql語句
 * @param {Array} params 對應上面sql語句的參數
 * @returns {Promise} 返回一個Promise
 */
function transaction(sqls, params) {
  return new Promise((resolve, reject) => {
    pool.getConnection(function (err, connection) {
      // 連接失敗 promise直接返回失敗
      if (err) {
        return reject(err);
      }
      // 如果 語句和參數數量不匹配 promise直接返回失敗
      if (sqls.length !== params.length) {
        connection.release(); // 釋放掉
        return reject(new Error("語句與傳值不匹配"));
      }
      // 開始執行事務
      connection.beginTransaction((beginErr) => {
        // 創建事務失敗
        if (beginErr) {
          connection.release();
          return reject(beginErr);
        }
        console.log("開始執行事務,共執行" + sqls.length + "條語句");
        // 返回一個promise 數組
        let funcAry = sqls.map((sql, index) => {
          return new Promise((sqlResolve, sqlReject) => {
            const data = params[index];
            connection.query(sql, data, (sqlErr, result) => {
              if (sqlErr) {
                return sqlReject(sqlErr);
              }
              sqlResolve(result);
            });
          });
        });
        // 使用all 方法 對里面的每個promise執行的狀態 檢查
        Promise.all(funcAry)
          .then((arrResult) => {
            // 若每個sql語句都執行成功了 才會走到這里 在這里需要提交事務,前面的sql執行才會生效
            // 提交事務
            connection.commit(function (commitErr, info) {
              if (commitErr) {
                // 提交事務失敗了
                console.log("提交事務失敗:" + commitErr);
                // 事務回滾,之前運行的sql語句不生效
                connection.rollback(function (err) {
                  if (err) console.log("回滾失敗:" + err);
                  connection.release();
                });
                // 返回promise失敗狀態
                return reject(commitErr);
              }

              connection.release();
              // 事務成功 返回 每個sql運行的結果 是個數組結構
              resolve(arrResult);
            });
          })
          .catch((error) => {
            // 多條sql語句執行中 其中有一條報錯 直接回滾
            connection.rollback(function () {
              console.log("sql運行失敗: " + error);
              connection.release();
              reject(error);
            });
          });
      });
    });
  });
}
module.exports = {
  transaction,
};
  • 之后只需要調用這個方法就可以執行 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 是數組格式 與sqls里的sql語句里 ? 一一對應
  [5, 3],
];

index
  .transaction(sqls, params)
  .then((arrResult) => {
    // do anything ....
  })
  .catch((err) => {
    // error
    console.log(err);
  });

以上就是對nodejs操作mysql數據庫的方法,經驗總結。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM